Устранение эскалации блокировок в MS SQL Server и PostgreSQL для 1С
- Массовые блокировки пользователей при попытке записи или проведения документов параллельно с отчетами.
- Переход строчных блокировок (Row/Key-Lock) в табличные (Exclusive Table Lock).
- Ошибки «Конфликт блокировок при выполнении транзакции» в 1С.
- Рост длительности ожидания в ТЖ по событию
TLOCKS.
1. Отключение эскалации блокировок на уровне таблиц в MS SQL Server
Для высоконагруженных регистров и таблиц документов отключите автоматическую эскалацию строк до уровня таблицы:
ALTER TABLE _AccumRgT1234 SET (LOCK_ESCALATION = DISABLE);
ALTER TABLE _Document123 SET (LOCK_ESCALATION = DISABLE);Или отключите эскалацию для всей базы глобально через флаг трассировки 1224:
DBCC TRACEON (1224, -1);2. Оптимизация в PostgreSQL (деактивация тяжелых блокировок)
В PostgreSQL эскалация строк до таблицы отсутствует по архитектуре (MVCC), но параллельные транзакции могут захватывать предикатные блокировки. Отредактируйте postgresql.conf:
max_locks_per_transaction = 256
lock_timeout = 20000
deadlock_timeout = 10003. Перевод конфигурации 1С на Управляемый режим блокировок
В конфигураторе 1С установите для свойства конфигурации «Режим управления блокировкой данных» значение Управляемый, исключив автоматический режим с неявным повышением уровня изоляции Serializable.
4. Дробление больших выборок в коде 1С
Избегайте чтения и обновления сотен тысяч записей в рамках одной транзакции:
// Выполняйте обработку порциями по 1000 - 5000 записей
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 5000 Ссылка ИЗ Документ.РеализацияТоваровУслуг ГДЕ Не Обработан"; Частые вопросы (FAQ)
При каком пороге строк MS SQL Server выполняет эскалацию блокировок?
По умолчанию SQL Server инициирует эскалацию блокировок, когда одна транзакция удерживает более 5 000 блокировок на одном уровне (например, строчные X/U блокировки).
Чем опасен флаг трассировки 1224?
Флаг 1224 запрещает эскалацию по количеству блокировок, но оставляет эскалацию при нехватке памяти под lock structures. Это требует достаточного объема RAM у инстанса SQL Server.
Почему в автоматическом режиме блокировок 1С эскалация происходит чаще?
В автоматическом режиме 1С транзакции работают на уровне изоляции Serializable в MS SQL, накладывая избыточные блокировки диапазонов (Range-Locks), быстро достигающие порога эскалации.
Как обнаружить событие эскалации блокировки в MS SQL?
Настройте сессию Extended Events с событием 'lock_escalation' или отслеживайте счетчик PerfMon 'SQLServer:Locks -> Lock Escalations/sec'.