1С Ошибка: Конфликт блокировок при выполнении транзакции — Решение
- Ошибка
Конфликт блокировок при выполнении транзакциипри одновременном проведении документов несколькими пользователями. - В технологическом журнале 1С фиксируются длительные события
TLOCKи взаимоблокировкиDEADLOCK. - Зависание сеансов пользователей на этапах записи регистров накопления и сведений.
- Падение параллельной производительности системы при увеличении числа активных пользователей.
1. Перевод конфигурации в режим управляемых блокировок (Managed Lock)
Автоматический режим блокировок использует тяжелые блокировки таблиц на уровне СУБД. Переведите конфигурацию в управляемый режим:
- В Конфигураторе откройте свойства корневого узла конфигурации.
- Установите параметр Режим управления блокировкой данных в значение Управляемый (Managed).
2. Установка явных управляемых блокировок в коде BSL перед записью
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ТоварыНаСкладах");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.УстановитьЗначение("Склад", ТекущийСклад);
ЭлементБлокировки.ИсточникДанных = ТаблицаТоваровДокумента;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
// Захват блокировки строго до начала чтения остатков
Блокировка.Заблокировать();3. Соблюдение единого алфавитного порядка блокировки ресурсов
Для исключения тупиковых взаимоблокировок (Deadlocks) всегда захватывайте ресурсы в строго одинаковом порядке во всех модулях системы (например: Склад -> Номенклатура -> Серия).
4. Минимизация времени нахождения внутри транзакции
// НЕПРАВИЛЬНО: Выполнение длительных расчетов или запросов внутри транзакции
НачатьТранзакцию();
// Тяжелый запрос к базе на 10 секунд...
ДокументОбъект.Записать();
ЗафиксироватьТранзакцию();
// ПРАВИЛЬНО: Все расчеты и чтение выполняются ДО открытия транзакции
ДанныеДляЗаписи = РассчитатьДанныеЗапросом();
НачатьТранзакцию();
ДокументОбъект.Записать();
ЗафиксироватьТранзакцию(); Частые вопросы (FAQ)
Чем управляемая блокировка (1С) отличается от транзакционной блокировки СУБД (SQL)?
Управляемые блокировки выставляются менеджером кластера 1С в оперативной памяти на логическом уровне метаданных, не нагружая СУБД эскалацией блокировок строк до целых таблиц.
Что такое Deadlock (взаимоблокировка) в 1С?
Ситуация, когда Транзакция 1 заблокировала Ресурс А и ждет Ресурс Б, а Транзакция 2 заблокировала Ресурс Б и ждет Ресурс А. СУБД принудительно аварийно прерывает одну из транзакций как жертву.
Как настроить технологический журнал для сбора конфликтов блокировок TLOCK?
Добавьте в logcfg.xml сбор событий TLOCK и TDEADLOCK с условием длительности Duration > 1000000 (более 1 секунды) для фиксации контекста BSL.
Помогает ли включение Read Committed Snapshot Isolation (RCSI) в MS SQL?
Да! Включение RCSI на базе SQL позволяет читающим транзакциям не блокировать пишущие, устраняя большинство конфликтов при параллельной работе.