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

Обычно при определении понятия транзакции используют перечень требований к этому механизму, сформулированный в конце 70-х гг. Джимом Греем в виде аббревиатуры ACID: Atomicity – атомарность, Consistency – согласованность, Isolation – изолированность, Durability – долговечность.

Атомарность транзакции уже пояснялась выше на примере банковской операции. Она заключается в гарантии того, что никакая транзакция не будет зафиксирована в БД частично: операторы изменения БД, включенные в транзакцию, либо выполнятся все, либо не выполнится ни один. В БД это свойство реализуется с помощью механизма отката, позволяющего отменить выполненные, но незафиксированные изменения БД.

Свойство согласованности заключатся в том, что транзакция должна фиксировать новое согласованное состояние БД. Это свойство тоже пояснялось на примере банковской операции. Здесь лишь еще раз отметим, что понятие согласованности зависит от предметной области, состояние которой отражается в БД.

Современные СУБД допускают одновременную (часто говорят – параллельную) работу нескольких транзакций. При этом параллельные транзакции могут изменять одни и те же данные в БД. Свойство изолированности гарантирует с точностью до определенного уровня отсутствие взаимного влияния параллельных транзакций на результаты их выполнения. Современные СУБД могут обеспечивать несколько уровней изолированности транзакций. Уровни изолированности транзакций, поддерживаемые MSS, будут рассматриваться позже.

Любая транзакция завершается либо фиксацией (оператор COMMIT), либо откатом (оператор ROLLBACK). Откат – это отмена всех изменений в БД, выполненных в рамках транзакции. Фиксация – подтверждение успешного завершения транзакции. Свойство долговечности заключается в том, что изменения в БД, выполненные и зафиксированные транзакцией, не могут быть отменены, кроме как с помощью новой транзакции.

 

Автоматическая фиксация транзакций

Режим автоматической фиксации (часто просто автофиксация) транзакции используется MSS по умолчанию. После завершения каждый оператор T-SQL фиксируется или откатывается. Если оператор выполняется без ошибок, то автоматически выполняется фиксация. В противном случае состояние БД откатывается назад.

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

 

Неявные транзакции

Режим неявной транзакции может быть включен для текущего соединения с сервером БД с помощью специальной инструкции T-SQL: SET IMPLICIT_TRANSACTIONS ON. После выполнения этой инструкции соединение переключается из режима автофиксации в режим неявной транзакции. Обратное переключение осуществляется с помощью аналогичной инструкции, но с использованием ключевого слова OFF вместо ON.

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

- CREATE, DROP;

- ALTER TABLE;

- INSERT, DELETE, UPDATE, SELECT, TRUNCATE TABLE;

- OPEN, FETCH;

- GRANT, REVOKE.

Неявная транзакция продолжается до тех пор, пока не будет выполнен оператор фиксации (COMMIT) или оператор отката (ROLLBACK) транзакции. На рис. 13.41, 13.42 приведены примеры, демонстрирующие использование режима неявной транзакции.

 

 

Рис. 13.4.1 Пример использования режима неявной транзакции
 с фиксацией изменений

 

В примере на рис. 13.41 с помощью инструкции SET осуществляется переключение соединения в режим неявной транзакции. Неявная транзакция стартует при выполнении оператора CREATE TABLE и завершается фиксацией изменений с помощью оператора COMMIT. После этого осуществляется возврат в режим автофиксации (инструкция SET OFF). Заметим: созданная таблица c именем X сохранилась после выполнения сценария.

Сценарий на рис. 13.42 отличается от сценария на рис. 13.41 только значением переменной с именем @ flag, установленным при инициализации. Следствием этого является выполнение оператора ROLLBACK, приведшее к отмене всех изменений в БД, осуществленных последней транзакцией (созданная таблица X не сохранилась).

 

Рис. 13.42. Пример использования режима неявной транзакции
с откатом изменений

 



Явные транзакции

Переключение в режим явной транзакции осуществляется с помощью оператора BEGIN TRANSACTION. Транзакцию должен завершать один из операторов: COMMIT TRANSACTION или ROLLBACK TRANSACTION. Ключевое слово TRANSACTION в перечисленных операторах может быть сокращено до TRAN. После завершения явной транзакции происходит возврат в исходный режим (автофиксации или неявной транзакции).

На рис. 13.43 приведен пример использования явной транзакции. Транзакция начинается внутри TRY-блока и в случае успешного выполнения завершатся здесь же (оператор COMMIT). Если при выполнении транзакции возникает ошибка, в CATH-блоке формируется и выводится соответствующее сообщение, а затем выполняется откат (ROLLBACK).

Рис. 13.43. Пример использования явной транзакции

 

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

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

Если транзакция состоит из нескольких относительно независимых блоков операторов T-SQL, изменяющих БД, то может быть использован оператор SAVE TRANSACTION, формирующий контрольную точку транзакции. Контрольная точка – это метка в явной транзакции, определяющая момент времени, к которому может быть выполнен откат.

На рис. 13.44 приведен сценарий, демонстрирующий применение трех контрольных точек в явной транзакции. Контрольные точки с именами p1, p2, и p3 с помощью операторов SAVE TRANSACTION установлены перед операторами INSERT. Если при выполнении INSERT формируется исключение, в блоке CATCH осуществляется откат к последней контрольной пройденной точке, а также фиксация изменений, выполненных до контрольной точки.

 

Рис. 13.44. Пример использования явной транзакции с контрольными точками

 

При выполнении сценария (рис. 13.44) последний оператор INSERT вызвал исключение с кодом 547. В блоке CATCH откат выполнен к контрольной точке p3. Это позволило сохранить и зафиксировать (оператор COMMIT) выполненные до этой контрольной точки изменения в таблице SUBJECT (удаление одной строки и добавление двух новых). Запрос на рис. 13.45 демонстрирует изменения в таблице SUBJECT после выполнения сценария на рис. 13.44.

 

Рис. 13.45. Результат выполнения сценария на рис. 13.44

 

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