Изоляция моментального снимка транзакции oltp в SQL Server

Попытка понять, как уровни изоляции транзакций работают на таблицах, оптимизированных для памяти 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.

2 ответа

Если вы действительно хотите понять поддерживаемые уровни изоляции для In-Memory OLTP при обращении как к традиционным таблицам, так и к таблицам, оптимизированным для памяти, вы также должны понимать режимы инициирования транзакций.

Все это подробно описано в моих постах:

http://nedotter.com/archive/2017/08/all-about-in-memory-isolation-levels-part-1/ http://nedotter.com/archive/2017/08/all-about-in-memory-isolation-levels-part-2/

Пожалуйста, дайте мне знать, если у вас есть дополнительные вопросы по этой часто неправильно понимаемой теме.

MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT опция базы данных должна быть включена для использования экспликации SNAPSHOT транзакция без подсказок. Ниже приводится выдержка из документации (выделена моя):

Явный - ваш Transact-SQL содержит код BEGIN TRANSACTION, а также возможный COMMIT TRANSACTION. Два или более операторов могут быть включены в одну и ту же транзакцию. В явном режиме вы должны либо использовать опцию базы данных MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT, либо кодировать табличную подсказку об уровне изоляции транзакции в оптимизированной для памяти таблице в предложении FROM.

Ниже приведен пример, который показывает, как включить эту опцию базы данных:

ALTER DATABASE YourDatabase
    SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = ON;