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 возвращает уровень вложенности транзакций.