MSSQL Error 1205: Deadlock victim — Анализ и устранение взаимоблокировок 1С
Ошибка 1205 генерируется встроенным монитором взаимоблокировок SQL Server (Deadlock Monitor), когда две или более сессии взаимно блокируют доступ к ресурсам (строки таблиц, страницы, ключи индексов), образуя циклическую зависимость. СУБД принудительно прерывает одну из сессий (жертву).
- Сообщение:
Transaction (Process ID %d) was deadlocked on %ls resources with another process and has been chosen as the deadlock victim. Rerun the transaction(Severity 13). - Пользователи 1С получают сообщение:
Конфликт блокировок при выполнении транзакции. Транзакция отменена. - Массовые сбои при одновременном проведении документов реализации, списания остатков и начисления зарплаты.
1. Настройка сессии Extended Events для автоматического сбора XML-графов дедлоков
CREATE EVENT SESSION [Capture_Deadlocks] ON SERVER
ADD EVENT sqlserver.xml_deadlock_report
ADD TARGET package0.event_file(SET filename=N'D:\MSSQL\Logs\Deadlocks.xel', max_file_size=50, max_rollover_files=5)
WITH (STARTUP_STATE=ON);
GO
ALTER EVENT SESSION [Capture_Deadlocks] ON SERVER STATE = START;
GO2. Извлечение и чтение графов дедлоков из системной сессии system_health
SELECT
XEvent.value('(event/@timestamp)[1]', 'datetime2') AS [DeadlockTime],
XEvent.query('(event/data[@name="xml_report"]/value/deadlock)[1]') AS [DeadlockGraph]
FROM (
SELECT CAST(target_data AS XML) AS TargetData
FROM sys.dm_xe_session_targets st
JOIN sys.dm_xe_sessions s ON s.address = st.event_session_address
WHERE s.name = 'system_health' AND st.target_name = 'ring_buffer'
) AS Data
CROSS APPLY TargetData.nodes('RingBufferTarget/event[@name="xml_deadlock_report"]') AS XEventData(XEvent);3. Идентификация таблиц 1С по шестнадцатеричным именам
В XML графе дедлока найдите имя объекта (например, _Document123 или _AccRG456) и сопоставьте его с метаданными 1С через функцию ПолучитьСтруктуруХраненияБазыДанных() в 1С или запрос:
-- Поиск физической таблицы в SQL
SELECT OBJECT_NAME(object_id) AS TableName
FROM sys.partitions
WHERE hobt_id = 72057594041139200; -- Значение hobtid из графа дедлока4. Методы устранения взаимоблокировок
- Управляемые блокировки 1С: Убедитесь, что конфигурация переведена в режим Управляемый (Managed Locks), исключающий автоматические эскалации блокировок MSSQL.
- Единый порядок захвата ресурсов: Гарантируйте проведение документов и обращение к регистрам в одинаковом алфавитном/ключевом порядке во всех модулях конфигурации 1С.
- Включение RCSI (Read Committed Snapshot Isolation) для устранения конфликтов между чтением и записью:
ALTER DATABASE [YourDatabaseName] SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE;
ALTER DATABASE [YourDatabaseName] SET ALLOW_SNAPSHOT_ISOLATION ON; Частые вопросы (FAQ)
По какому принципу SQL Server выбирает жертву дедлока (Victim)?
СУБД выбирает процесс с наименьшим приоритетом DEADLOCK_PRIORITY. Если приоритеты равны, жертвой становится транзакция, откат которой требует наименьших затрат ресурсов процессора и журнала (наименьший объем сгенерированного лога).
Помогает ли увеличение оперативной памяти или ядер CPU от дедлоков?
Нет. Взаимоблокировка — это алгоритмическая проблема логики кода и порядка захвата ресурсов транзакциями. Более быстрый CPU лишь увеличивает частоту возникновения коллизий при параллельной работе.
Что такое RCSI и решает ли он проблему дедлоков в 1С?
Режим Read Committed Snapshot Isolation (RCSI) предотвращает блокировку читающих запросов пишущими, сохраняя старые версии строк в tempdb. Это полностью устраняет дедлоки вида 'Чтение-Запись'.
Как включить флаг трассировки 1222 для вывода дедлоков в лог?
Выполните: DBCC TRACEON (1222, -1);. Информация о структуре взаимоблокировок начнет подробно записываться в стандартный SQL Server ERRORLOG.