MSSQL Ошибка 3960: Snapshot isolation update conflict — Решение
- Сообщение:
Msg 3960, Level 16, State 1: Snapshot isolation transaction aborted due to update conflict. You cannot use snapshot isolation to access table '...' directly or indirectly in database '...' to update, delete, or insert the row that has been modified or deleted by another transaction. - Падение параллельных сеансов 1С при одновременной записи или проведении документов.
- Высокая нагрузка на базу данных
tempdb(разрастание хранилища версий Version Store).
1. Принцип возникновения конфликта версий
Ошибка 3960 возникает при использовании уровня изоляции SNAPSHOT или RCSI (Read Committed Snapshot Isolation), когда две транзакции одновременно пытаются обновить одну и ту же строку, которая была изменена первой транзакцией уже после старта второй транзакции.
2. Анализ конфликтующих сессий через Extended Events
Создайте сессию расширенных событий для перехвата конфликтов Snapshot Isolation:
CREATE EVENT SESSION [SnapshotConflicts] ON SERVER
ADD EVENT sqlserver.error_reported(
ACTION(sqlserver.sql_text, sqlserver.tsql_stack, sqlserver.session_id)
WHERE ([error_number] = (3960))
)
ADD TARGET package0.event_file(SET filename=N'D:\Logs\SnapshotConflicts.xel');
GO
ALTER EVENT SESSION [SnapshotConflicts] ON SERVER STATE = START;
GO3. Оптимизация tempdb и хранилища версий строк
Убедитесь, что хранилище версий в tempdb успевает очищаться и не перегружено:
SELECT
SUM(version_store_reserved_page_count) * 8 / 1024 AS VersionStore_MB,
GETDATE() AS CurrentTime
FROM sys.dm_db_file_space_usage;
GO4. Рекомендации по оптимизации для 1С:Предприятие
- Для баз 1С стандартным и рекомендованным фирмой «1С» является режим RCSI (Read Committed Snapshot Isolation), а не строгий SNAPSHOT. Проверьте параметры базы:
-- Проверка статуса
SELECT name, is_read_committed_snapshot_on, snapshot_isolation_state_desc
FROM sys.databases WHERE name = 'Base1C';
GO
-- Корректный режим для 1С:
ALTER DATABASE [Base1C] SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE;
ALTER DATABASE [Base1C] SET ALLOW_SNAPSHOT_ISOLATION OFF;
GO Частые вопросы (FAQ)
В чем разница между READ_COMMITTED_SNAPSHOT и ALLOW_SNAPSHOT_ISOLATION?
RCSI (Read Committed Snapshot) предоставляет снимок данных на уровне каждого отдельного оператора SELECT и не вызывает ошибку 3960 при параллельных UPDATE. Строгий Snapshot Isolation фиксирует снимок на уровне всей транзакции и прерывает ее при пересечении изменений.
Почему 1С рекомендует включать RCSI?
RCSI устраняет блокировки чтения пишущими транзакциями (SELECT не блокирует UPDATE, а UPDATE не блокирует SELECT), что кардинально повышает параллельность работы пользователей без риска дедлоков на чтении.
Как приложение должно обрабатывать ошибку 3960?
При получении ошибки 3960 транзакция должна быть полностью откатана, после чего клиентское приложение (или код 1С) должно повторить попытку выполнения бизнес-транзакции (Retry Logic).
Влияет ли размер tempdb на возникновение ошибки 3960?
Нехватка места в tempdb приводит к невозможности записи новых версий строк, что вызывает сбои транзакций. Однако сам конфликт 3960 вызывается логическим пересечением изменяемых данных.