Уровни изоляции транзакций в таблицах, оптимизированных для памяти
Поддерживаются следующие уровни изоляции для транзакций, обращающихся к оптимизированным для памяти таблицам.
SNAPSHOT
REPEATABLE READ
SERIALIZABLE
READ COMMITTED
Уровень изоляции транзакции может быть указан как часть блока ATOMIC хранимой процедуры, скомпилированной в собственном коде. Дополнительные сведения см. в статье CREATE PROCEDURE (Transact-SQL). При доступе к оптимизированным для памяти таблицам из интерпретированного Языка Transact-SQL уровень изоляции можно указать с помощью указаний на уровне таблицы.
При определении скомпилированной в собственном коде хранимой процедуры необходимо указать уровень изоляции транзакции. При доступе к оптимизированным для памяти таблицам из пользовательских транзакций в интерпретируемом Transact-SQL необходимо указать уровень изоляции в табличных указаниях. Дополнительные сведения см. в статье Рекомендации по уровням изоляции транзакций с Memory-Optimized таблицами.
Уровень изоляции READ COMMITTED поддерживается для оптимизированных для памяти таблиц с транзакциями с автоматической фиксацией. Использование уровня изоляции READ COMMITTED недопустимо в пользовательских транзакциях или в атомарном блоке. Для явных и неявных пользовательских транзакций не поддерживается READ COMMITTED. Уровень изоляции READ_COMMITTED_SNAPSHOT поддерживается для таблиц, оптимизированных для памяти, с транзакциями в режиме автофиксации и только в том случае, если запрос не обращается к таблицам на локальном компьютере. Кроме того, транзакции, запущенные с помощью интерпретированного Transact-SQL с изоляцией SNAPSHOT, не могут получить доступ к оптимизированным для памяти таблицам. Транзакции, использующие интерпретируемый Transact-SQL с изоляцией REPEATABLE READ или SERIALIZABLE, должны обращаться к оптимизированным для памяти таблицам с помощью изоляции SNAPSHOT. Дополнительные сведения об этом сценарии см. в разделе Межконтейнерные транзакции.
READ COMMITTED — это уровень изоляции по умолчанию в SQL Server. Если уровень изоляции сессии задан как READ COMMITED (или ниже), то можно выполнить одно из следующих действий.
Явно используйте более высокий уровень изоляции для доступа к оптимизированной для памяти таблицы (например, WITH (SNAPSHOT)).
Укажите параметр
MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT
, который установит уровень изоляции SNAPSHOT для оптимизированных для памяти таблиц (если бы вы добавили указание WITH (SNAPSHOT) в каждую оптимизированную для памяти таблицу). Дополнительные сведения оMEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT
см. в разделе Параметры ALTER DATABASE SET (Transact-SQL).
Кроме того, если уровень изоляции сессии задан как уровень изоляции READ COMMITTED, можно использовать режим автоматической фиксации транзакций.
Транзакция SNAPSHOT, запущенная в интерпретируемом Transact-SQL, не может получить доступ к таблицам, оптимизированным для памяти.
Поддерживаемые для оптимизированных для памяти таблиц уровни изоляции транзакций предоставляют те же логические гарантии, что и дисковые таблицы. Механизм, используемый для предоставления гарантий уровня изоляции, — иной.
Для дисковых таблиц большинство гарантий уровня изоляции реализуются с использованием блокировки, что предотвращает конфликты через блокировку. Гарантии для оптимизированных для памяти таблиц задаются с помощью механизма обнаружения конфликтов, который исключает необходимость принимать блокировки. Исключение — режим изоляции SNAPSHOT в дисковых таблицах. Способ реализации такой же, как в режиме изоляции SNAPSHOT для оптимизированных для памяти таблиц с помощью механизма обнаружения конфликтов.
SNAPSHOT
Этот уровень изоляции указывает на то, что данные, считанные любой инструкцией транзакции, будут согласованы на уровне транзакции с версией данных, существовавших в ее начале. Транзакция распознает только те изменения, которые были зафиксированы до ее начала. Инструкции, выполняемые текущей транзакцией, не видят изменений данных, произведенных другими транзакциями после запуска текущей транзакции. Инструкции в транзакции получают моментальный снимок зафиксированных данных на момент запуска транзакции.
Операции записи (обновления, вставки и удаления) всегда полностью изолированы от других транзакций. Таким образом, операции записи в транзакции SNAPSHOT могут конфликтовать с операциями записи других транзакций. Если текущая транзакция пытается обновить или удалить строку, которая была обновлена или удалена другой транзакцией, зафиксированной после начала текущей транзакции, она прерывается со следующим сообщением об ошибке.
Ошибка 41302. Текущая транзакция попыталась обновить запись в таблице X, которая была изменена после начала этой транзакции. Транзакция была прервана.
Если текущая транзакция попытается вставить строку с тем же значением первичного ключа, как у строки, вставленной другой транзакцией, зафиксированной до текущей транзакции, то произойдет сбой фиксации со следующим сообщением об ошибке.
Ошибка 41325. Текущей транзакции не удалось выполнить фиксацию из-за ошибки сериализуемой проверки.
Если транзакция выполняет запись в таблицу, которая удалена до того, как транзакция зафиксирована, она прекращается со следующим сообщением об ошибке.
Ошибка 41305. Текущей транзакции не удалось выполнить фиксацию из-за ошибки проверки уровня изоляции REPEATABLE READ.
REPEATABLE READ
Этот уровень изоляции включает гарантии, заданные уровнем изоляции SNAPSHOT. Кроме того, REPEATABLE READ гарантирует, что для любой строки, считанной транзакцией, в момент фиксации строка не была изменена никакой другой транзакцией. Каждая операция чтения в транзакции повторяема до конца транзакции.
Если текущая транзакция прочитала любую строку, которая затем обновлена другой транзакцией, которая выполнила фиксацию до текущей транзакции, то фиксация завершается сбоем и возвращает сообщение об ошибке.
Ошибка 41305. Текущей транзакции не удалось выполнить фиксацию из-за ошибки проверки уровня изоляции REPEATABLE READ.
SERIALIZABLE
Этот уровень изоляции включает гарантии, предоставляемые уровнем изоляции REPEATABLE READ. Фантомные строки не появлялись между созданием моментального снимка и окончанием транзакции. Фантомные строки удовлетворяют условию фильтра выбора, обновления или удаления.
Транзакция выполняется, как будто параллельных транзакций нет. Фактически все действия выполняются в одной точке сериализации (время фиксации).
Если любая из этих гарантий нарушена, транзакции не удастся выполнить фиксацию со следующим сообщением об ошибке.
Ошибка 41325. Текущей транзакции не удалось выполнить фиксацию из-за ошибки сериализуемой проверки.
См. также:
Основные сведения о транзакциях с таблицами, оптимизированными для памяти
Рекомендации для уровней изоляции транзакций с таблицами, оптимизированными для памяти
Рекомендации для логики повторного выполнения транзакций для таблиц, оптимизированных для памяти