Попытка понять, как уровни изоляции транзакций работают с таблицами, оптимизированными для памяти SQL Server (oltp в памяти).
Если я выполню следующий запрос:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
BEGIN TRANSACTION
SELECT *
FROM tm.Tasks
Сообщение об ошибкеотображается:
Доступ к таблицам, оптимизированным для памяти, с использованием уровня изоляции READ COMMITTED поддерживается только для транзакций автоматического подтверждения.Он не поддерживается для явных или неявных транзакций.Обеспечьте поддерживаемый уровень изоляции для оптимизированной для памяти таблицы, используя табличную подсказку, например WITH (SNAPSHOT).
Теперь, если я изменяю запрос, добавляя табличную подсказку, он работает:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
GO
BEGIN TRANSACTION
SELECT *
FROM tm.Tasks WITH(SNAPSHOT)
Но если изменить уровень изоляции транзакции с помощью SET TRANSACTION ISOLATION LEVEL SNAPSHOT
и удалить подсказку таблицы:
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
BEGIN TRANSACTION
SELECT *
FROM tm.Tasks
, она не будет работать снова, отображая сообщение об ошибке:
Таблицы, оптимизированные для памяти, иСобственно скомпилированные модули не могут быть доступны или созданы, если для сеанса TRANSACTION ISOLATION LEVEL установлено значение SNAPSHOT.
Почему он работает с подсказкой таблицы и задает уровень изоляции транзакции с помощью
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
нет?
Обновление : Попытка установки MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT
на ON
, все еще получая ту же ошибку из последнего запроса:
Таблицы, оптимизированные для памятии нативно скомпилированные модули не могут быть доступны или созданы, если для сеанса TRANSACTION ISOLATION LEVEL установлено значение SNAPSHOT.