MSSQL Error 41368: Accessing memory optimized tables using READ COMMITTED — Решение
- Ошибка выполнения запроса:
Error: 41368, Severity: 16, State: 1. Accessing memory optimized tables using the READ COMMITTED isolation level is supported only for autocommit transactions. It is not supported for explicit or implicit transactions. - Сбой при выполнении запросов 1С внутри явных транзакционных блоков
BEGIN TRANSACTION ... COMMIT. - Невозможность выполнить SELECT из оптимизированной таблицы при стандартных настройках сессии 1С.
1. Причина ограничения уровня READ COMMITTED в Hekaton
Ядро In-Memory OLTP не поддерживает классический уровень READ COMMITTED с блокировками чтения внутри пользовательских явных транзакций (Explicit Transactions). Доступ возможен либо в режиме автофиксации одиночной команды (Autocommit), либо с явным указанием хинта поддерживаемой изоляции (SNAPSHOT, REPEATABLEREAD, SERIALIZABLE).
2. Глобальное решение через параметр базы данных (Рекомендуемое)
Включите автоматическое неявное повышение изоляции READ COMMITTED до SNAPSHOT для всех Memory-Optimized таблиц базы данных:
-- Включение автоматического сопоставления READ COMMITTED -> SNAPSHOT
ALTER DATABASE [buh_1c_db]
SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = ON;3. Использование табличных хинтов в T-SQL коде
Если изменить параметры базы данных невозможно, явно укажите хинт WITH (SNAPSHOT) в запросе:
BEGIN TRANSACTION;
-- Явное указание уровня изоляции для таблицы Hekaton
SELECT
ItemCode,
StockQty
FROM dbo.CurrentStock_InMemory WITH (SNAPSHOT)
WHERE WarehouseID = 10;
COMMIT TRANSACTION;4. Проверка текущих параметров изоляции базы 1С
SELECT
name,
is_memory_optimized_elevate_to_snapshot_on
FROM sys.databases
WHERE database_id = DB_ID(); Частые вопросы (FAQ)
Что делает опция MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT?
При установке в ON любые запросы внутри явных транзакций, выполняющиеся с уровнем READ COMMITTED (стандарт для 1С), автоматически и прозрачно для приложения выполняются как SNAPSHOT при обращении к memory-optimized таблицам.
Почему одиночный SELECT без BEGIN TRANSACTION работает без ошибок?
Одиночные команды вне явного транзакционного блока работают в режиме Autocommit (автоматическая фиксация), для которого уровень READ COMMITTED официально разрешен ядром Hekaton.
Влияет ли опция ELEVATE_TO_SNAPSHOT на обычные дисковые таблицы?
Нет, эта опция влияет исключительно на обращения к таблицам с параметром MEMORY_OPTIMIZED = ON и не меняет поведение обычных дисковых таблиц 1С.
Требуется ли переводить базу в монопольный режим (Single User) для включения опции?
Нет, команда ALTER DATABASE ... SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = ON выполняется мгновенно в режиме онлайн без разрыва сеансов пользователей 1С.