Уровень изолированности SNAPSHOT
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

Уровень изолированности SNAPSHOT (снимок) обеспечивает полную изолированность (см. табл. 13.3) и при этом не блокирует строки таблицы. Транзакция с этим уровнем изолированности «видит» строки таблиц в версии, в которой она застала их при первом чтении. При последующих чтениях транзакция будет «видеть» только те изменения БД, которые произвела сама.

Применение уровня изолированности SNAPSHOT требует установки опции ALLOW_SNAPSHOT_ISOLATION для БД на уровне сервера (рис. 13.55).

 

Рис. 13.55. Установка опции, разрешающей в БД В STU применять
уровень изолированности SNAPSHOT

 

На рис. 13.56 и 13.57 демонстрируется взаимодействие двух транзакций: A и B. При этом для транзакции A установлен уровень изолированности SNAPSHOT.

 

Рис. 13.56. Уровень изолированности SNAPSHOT: транзакция А

 

Рис. 13.57. Уровень изолированности SNAPSHOT: транзакция В

Обратите внимание:

1) для транзакции A установлен уровень изоляции SNAPSHOT;

2) при повторном чтении в транзакции A (второй оператор SELECT) отражаются только те изменения, которые она выполнила сама.

Ошибка в SNAPSHOT-транзакции возникает при попытке изменить или удалить строку, которая к этому времени была уже удалена или изменена другой транзакцией. Сценарии на рис. 13.58 и 13.59 демонстрируют две параллельных транзакции: A и B. Для транзакции A установлен уровень изолированности SNAPSHOT.

 

Рис. 13.58. Уровень изолированности SNAPSHOT: транзакция А

 

Рис. 13.59. Уровень изолированности SNAPSHOT: транзакция B

 

Обратите внимание:

1) для транзакции A установлен уровень изоляции SNAPSHOT;

2) при попытке транзакцией A удалить строку (оператор DELETE), которая была изменена (UPDATE) транзакцией B, возникает ошибка с кодом 3960;

3) в транзакции A применяется оператор WAITFOR DELAY, позволяющий приостановить выполнение сценария с транзакцией A для того, чтобы выполнить после момента времени t1 сценарий с транзакцией B.

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

 


Вложенные транзакции

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

1. COMMIT вложенной транзакции действует только на внутренние операции вложенной транзакции.

2. ROLLBACK внешней транзакции отменяет зафиксированные операции внутренней транзакции.

3. ROLLBACK вложенной транзакции действует на операции внешней и внутренней транзакции, а также завершает обе транзакции.

4. Уровень вложенности транзакции можно определить с помощью встроенной системной функции @@TRANCOUT.

На рис. 13.60 представлен пример, демонстрирующий свойство 2 при работе с вложенной транзакцией.

 

Рис. 13.60. Отмена оператором ROLLBACK внешней транзакции
зафиксированных операций внутренней транзакции

 

Обратите внимание:

1) внутренняя транзакция завершается фиксацией своих операций;

2) ROLLBACK внешней транзакции отменяет зафиксированные операции внутренней транзакции.

На рис. 13.61 представлен пример, демонстрирующий свойство 3 при работе с вложенной транзакцией.

 

Рис. 13.61. Действие оператора ROLLBACK вложенной транзакции
 на операции внешней и внутренней транзакции

 

Обратите внимание:

1) внутренняя транзакция завершается откатом своих операций;

2) ROLLBACK внутренней транзакции отменяет действия внутренней и внешней транзакций;

3) ROLLBACK внутренней транзакции завершает внутреннюю и внешнюю транзакции;

4) функция @@TRANCOUNT возвращает 0, если она выполнена вне транзакции.

 



Дата: 2019-02-25, просмотров: 197.