Изоляция моментального снимка транзакции 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;