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

Определение транзакций

Управление транзакциями в среде MS SQL Server

SQL Server предлагает множество средств управления поведением транзакций. Пользователи в основном должны указывать только начало и конец транзакции, используя команды SQL или API (прикладного интерфейса программирования). Транзакция определяется на уровне соединения с базой данных и при закрытии соединения автоматически закрывается. Если пользователь попытается установить соединение снова и продолжить выполнение транзакции, то это ему не удастся. Когда транзакция начинается, все команды, выполненные в соединении, считаются телом одной транзакции, пока не будет достигнут ее конец.

SQL Server поддерживает три вида определения транзакций:

  • явное;
  • автоматическое;
  • подразумеваемое.

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

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

Сервер работает только в одном из двух режимов определения транзакций: автоматическом или подразумевающемся. Он не может находиться в режиме исключительно явного определения транзакций. Этот режим работает поверх двух других.

Для установки режима автоматического определения транзакций используется команда:

SET IMPLICIT_TRANSACTIONS OFF

При работе в режиме неявного (подразумевающегося) начала транзакций SQL Server автоматически начинает новую транзакцию, как только завершена предыдущая. Установка режима подразумевающегося определения транзакций выполняется посредством другой команды:

SET IMPLICIT_TRANSACTIONS ON

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

  • начало транзакции: в журнале транзакций фиксируются первоначальные значения изменяемых данных и момент начала транзакции;
· BEGIN TRAN[SACTION]· [имя_транзакции |· @имя_переменной_транзакции· [WITH MARK [‘описание_транзакции’]]]
  • конец транзакции: если в теле транзакции не было ошибок, то эта команда предписывает серверу зафиксировать все изменения, сделанные в транзакции, после чего в журнале транзакций помечается, что изменения зафиксированы и транзакция завершена;
· COMMIT [TRAN[SACTION]· [имя_транзакции | · @имя_переменной_транзакции]]
  • создание внутри транзакции точки сохранения: СУБД сохраняет состояние БД в текущей точке и присваивает сохраненному состоянию имя точки сохранения;
· SAVE TRAN[SACTION]· {имя_точки_сохранеия | · @имя_переменной_точки_сохранения}
  • прерывание транзакции; когда сервер встречает эту команду, происходит откат транзакции, восстанавливается первоначальное состояние системы и в журнале транзакций отмечается, что транзакция была отменена. Приведенная ниже команда отменяет все изменения, сделанные в БД после оператора BEGIN TRANSACTION или отменяет изменения, сделанные в БД после точки сохранения, возвращая транзакцию к месту, где был выполнен оператор SAVE TRANSACTION.
· ROLLBACK [TRAN[SACTION]· [имя_транзакции |· @имя_переменной_транзакции· | имя_точки_сохранения· |@имя_переменной_точки_сохранения]]

Функция @@TRANCOUNT возвращает количество активных транзакций.

Функция @@NESTLEVEL возвращает уровень вложенности транзакций.

BEGIN TRANSAVE TRANSACTION point1

Пример 16.1. Использование точек сохранения (html, txt)

В точке point1 сохраняется первоначальное состояние таблицы Товар

DELETE FROM Товар WHERE КодТовара=2 SAVE TRANSACTION point2

В точке point2 сохраняется состояние таблицы Товар без товаров с кодом 2.

DELETE FROM Товар WHERE КодТовара=3 SAVE TRANSACTION point3

В точке point3 сохраняется состояние таблицы Товар без товаров с кодом 2 и с кодом 3.

DELETE FROM Товар WHERE КодТовара<>1 ROLLBACK TRANSACTION point3

Происходит возврат в состояние таблицы без товаров с кодами 2 и 3, отменяется последнее удаление.

SELECT * FROM Товар

Оператор SELECT покажет таблицу Товар без товаров с кодами 2 и 3.

ROLLBACK TRANSACTION point1

Происходит возврат в первоначальное состояние таблицы.

SELECT * FROM ТоварCOMMIT

Первоначальное состояние сохраняется.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: