Изоляция моментального снимка транзакции oltp в SQL Server - PullRequest
0 голосов
/ 03 марта 2019

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

0 голосов
/ 24 марта 2019

Если вы действительно хотите понять поддерживаемые уровни изоляции для 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/

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

0 голосов
/ 03 марта 2019

Параметр базы данных 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...