MSSQL Ошибка 3961: Snapshot isolation transaction failed in database — Решение
- Сообщение:
Msg 3961, Level 16, State 1: Snapshot isolation transaction failed in database 'Base1C' because the database does not allow snapshot isolation. Use ALTER DATABASE to allow snapshot isolation. - Сбой запросов с уровнем изоляции
SET TRANSACTION ISOLATION LEVEL SNAPSHOT. - Внешние сервисы аналитики (PowerBI, ClickHouse, Apache Superset) не могут выгрузить данные из базы 1С.
1. Анализ причины сбоя
Клиентское приложение или ETL-коннектор явно запросил уровень изоляции SNAPSHOT, однако в свойствах целевой базы данных отключен параметр ALLOW_SNAPSHOT_ISOLATION.
2. Включение Snapshot Isolation через T-SQL
Выполните команду модификации конфигурации базы данных:
ALTER DATABASE [Base1C] SET ALLOW_SNAPSHOT_ISOLATION ON;
GOПримечание: Команда может выполняться продолжительное время, если в базе есть активные незавершенные транзакции.
3. Комплексная проверка параметров версионирования
SELECT
name,
snapshot_isolation_state_desc,
is_read_committed_snapshot_on
FROM sys.databases
WHERE name = 'Base1C';
GO4. Настройка прав и пулов tempdb
После включения ALLOW_SNAPSHOT_ISOLATION ON база начинает активно использовать tempdb для хранения цепочек версий строк (Version Store). Убедитесь в наличии достаточного свободного места на накопителе с tempdb (не менее 20-30% от размера самой активной таблицы).
Частые вопросы (FAQ)
Требуется ли монопольный доступ (Single User) для включения ALLOW_SNAPSHOT_ISOLATION?
Нет, монопольный доступ не требуется, но команда будет ожидать завершения всех уже выполняющихся транзакций в базе данных.
Использует ли платформа 1С:Предприятие уровень изоляции SNAPSHOT по умолчанию?
Нет, платформа 1С использует уровень READ COMMITTED (с включенным RCSI) или собственный управляемый режим блокировок. Уровень SNAPSHOT чаще всего запрашивают сторонние системы отчетности и BI.
Увеличивает ли ALLOW_SNAPSHOT_ISOLATION нагрузку на CPU?
Нагрузка на CPU возрастает незначительно (накладные расходы на добавление 14 байт указателя версии к строкам), но возрастает нагрузка на дисковую подсистему tempdb.
Как отключить Snapshot Isolation обратно?
Выполните команду: ALTER DATABASE [Base1C] SET ALLOW_SNAPSHOT_ISOLATION OFF; Хранилище версий tempdb будет автоматически очищено фоновым потоком Ghost Cleanup.