Поделиться через


Уровни изоляции транзакций в таблицах, оптимизированных для памяти

Следующие уровни изоляции поддерживаются для транзакций, обращаюющихся к таблицам, оптимизированным для памяти.

  • МОМЕНТАЛЬНЫЙ СНИМОК

  • ПОВТОРЯЕМОЕ ЧТЕНИЕ

  • Сериализуемый

  • READ COMMITTED (Уровень изоляции транзакций)

Уровень изоляции транзакций можно указать как часть атомарной части нативно скомпилированной хранимой процедуры. Дополнительные сведения см. в статье 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 Options (Transact-SQL).

Кроме того, если уровень изоляции сеанса — READ COMMITTED, можно использовать операции автоматической фиксации.

Транзакции SNAPSHOT, начатые в интерпретируемой среде Transact-SQL, не могут получить доступ к оптимизированным для памяти таблицам.

Уровни изоляции транзакций, поддерживаемые для таблиц, оптимизированных для памяти, предоставляют те же логические гарантии, что и таблицы на основе дисков. Механизм, используемый для предоставления гарантий уровня изоляции, отличается.

Для таблиц на основе дисков большинство гарантий уровня изоляции реализуются с помощью блокировки, что предотвращает конфликты путем блокировки. Для таблиц, оптимизированных для памяти, гарантии применяются с помощью механизма обнаружения конфликтов, что позволяет избежать необходимости принимать блокировки. Исключением является изоляция SNAPSHOT в таблицах на основе дисков. Это реализуется аналогично изоляции SNAPSHOT в таблицах, оптимизированных для памяти, с помощью механизма обнаружения конфликтов.

МОМЕНТАЛЬНЫЙ СНИМОК
Этот уровень изоляции указывает, что данные, считываемые любой инструкцией в транзакции, будут транзакционно согласованной версией данных, которые существовали в начале транзакции. Транзакция может распознавать только изменения данных, зафиксированные до начала транзакции. Изменения данных, внесенные другими транзакциями после начала текущей транзакции, не видны выполняемым в текущей транзакции операторам SQL. Операторы в транзакции получают моментальный снимок зафиксированных данных, как он существовал в начале транзакции.

Операции записи (обновления, вставки и удаления) всегда полностью изолированы от других транзакций. Поэтому операции записи в транзакции SNAPSHOT могут конфликтовывать с операциями записи другими транзакциями. Когда текущая транзакция пытается обновить или удалить строку, которая была обновлена или удалена другой транзакцией, зафиксированной после запуска текущей транзакции, транзакция завершается следующим сообщением об ошибке.

Ошибка 41302. Текущая транзакция попыталась обновить запись в таблице X, которая была обновлена с момента запуска этой транзакции. Транзакция была прервана.

Когда текущая транзакция пытается вставить строку с тем же значением первичного ключа, что и строка, вставленная другой транзакцией, зафиксированной перед текущей транзакцией, произойдет сбой фиксации со следующим сообщением об ошибке.

Ошибка 41325. Текущей транзакции не удалось выполнить фиксацию из-за ошибки сериализуемой проверки.

Если транзакция записывается в таблицу, которая удаляется до фиксации транзакции, транзакция завершается следующим сообщением об ошибке:

Ошибка 41305. Текущей транзакции не удалось выполнить фиксацию из-за ошибки проверки уровня изоляции REPEATABLE READ.

ПОВТОРЯЕМОЕ ЧТЕНИЕ
Этот уровень изоляции включает гарантии, предоставляемые уровнем изоляции SNAPSHOT. Кроме того, REPEATABLE READ гарантирует, что, когда транзакция завершается, ни одна из строк, считанных транзакцией, не была изменена другой транзакцией. Каждая операция чтения в транзакции повторяется до конца транзакции.

Если текущая транзакция прочитала строку, которая затем была обновлена другой транзакцией, завершенной до текущей транзакции, попытка фиксации завершается с ошибкой и отображается следующее сообщение об ошибке.

Ошибка 41305. Текущей транзакции не удалось выполнить фиксацию из-за ошибки проверки уровня изоляции REPEATABLE READ.

Сериализуемый
Этот уровень изоляции включает гарантии, предоставляемые REPEATABLE READ. Между моментальным снимком и окончанием транзакции не появились фантомные строки. Фантомные строки соответствуют условию фильтра выбора, обновления или удаления.

Транзакция выполняется так, как если бы не было параллельных транзакций. Все действия практически происходят в одной точке сериализации (момент фиксации).

Если какие-либо из этих гарантий нарушены, транзакция не зафиксируется со следующим сообщением об ошибке:

Ошибка 41325. Текущей транзакции не удалось выполнить фиксацию из-за ошибки сериализуемой проверки.

См. также

Общие сведения о транзакциях в таблицах Memory-Optimized
Рекомендации по уровням изоляции транзакций с таблицами Memory-Optimized
Рекомендации по логике повторных попыток для транзакций в таблицах Memory-Optimized