Управление транзакциями в среде MS SQL Server
Определение транзакций SQL Server предлагает множество средств управления поведением транзакций. Пользователи в основном должны указывать только начало и конец транзакции, используя команды SQL или API (прикладного интерфейса программирования). Транзакция определяется на уровне соединения с базой данных и при закрытии соединения автоматически закрывается. Если пользователь попытается установить соединение снова и продолжить выполнение транзакции, то это ему не удастся. Когда транзакция начинается, все команды, выполненные в соединении, считаются телом одной транзакции, пока не будет достигнут ее конец. SQL Server поддерживает три вида определения транзакций: · явное; · автоматическое; · подразумеваемое. По умолчанию SQL Server работает в режиме автоматического начала транзакций, когда каждая команда рассматривается как отдельная транзакция. Если команда выполнена успешно, то ее изменения фиксируются. Если при выполнении команды произошла ошибка, то сделанные изменения отменяются и система возвращается в первоначальное состояние. Когда пользователю понадобится создать транзакцию, включающую несколько команд, он должен явно указать транзакцию. Сервер работает только в одном из двух режимов определения транзакций: автоматическом или подразумевающемся. Он не может находиться в режиме исключительно явного определения транзакций. Этот режим работает поверх двух других. Для установки режима автоматического определения транзакций используется команда: SET IMPLICIT_TRANSACTIONS OFFПри работе в режиме неявного (подразумевающегося) начала транзакций SQL Server автоматически начинает новую транзакцию, как только завершена предыдущая. Установка режима подразумевающегося определения транзакций выполняется посредством другой команды:
Явные транзакции Явные транзакции требуют, чтобы пользователь указал начало и конец транзакции, используя следующие команды: · начало транзакции: в журнале транзакций фиксируются первоначальные значения изменяемых данных и момент начала транзакции; · BEGIN TRAN[SACTION]· [имя_транзакции |· @имя_переменной_транзакции[WITH MARK [‘описание_транзакции’]]]· конец транзакции: если в теле транзакции не было ошибок, то эта команда предписывает серверу зафиксировать все изменения, сделанные в транзакции, после чего в журнале транзакций помечается, что изменения зафиксированы и транзакция завершена; · COMMIT [TRAN[SACTION]· [имя_транзакции | @имя_переменной_транзакции]]· создание внутри транзакции точки сохранения: СУБД сохраняет состояние БД в текущей точке и присваивает сохраненному состоянию имя точки сохранения; · SAVE TRAN[SACTION]· {имя_точки_сохранеия | @имя_переменной_точки_сохранения}· прерывание транзакции; когда сервер встречает эту команду, происходит откат транзакции, восстанавливается первоначальное состояние системы и в журнале транзакций отмечается, что транзакция была отменена. Приведенная ниже команда отменяет все изменения, сделанные в БД после оператора BEGIN TRANSACTION или отменяет изменения, сделанные в БД после точки сохранения, возвращая транзакцию к месту, где был выполнен оператор SAVE TRANSACTION. · ROLLBACK [TRAN[SACTION]· [имя_транзакции |· @имя_переменной_транзакции· | имя_точки_сохранения |@имя_переменной_точки_сохранения]]Функция @@TRANCOUNT возвращает количество активных транзакций. Функция @@NESTLEVEL возвращает уровень вложенности транзакций. BEGIN TRANSAVE TRANSACTION point116.1. Использование точек сохранения В точке point1 сохраняется первоначальное состояние таблицы Товар DELETE FROM Товар WHERE КодТовара=2 SAVE TRANSACTION point2В точке point2 сохраняется состояние таблицы Товар без товаров с кодом 2.
В точке point3 сохраняется состояние таблицы Товар без товаров с кодом 2 и с кодом 3. DELETE FROM Товар WHERE КодТовара<>1 ROLLBACK TRANSACTION point3Происходит возврат в состояние таблицы без товаров с кодами 2 и 3, отменяется последнее удаление. SELECT * FROM ТоварОператор SELECT покажет таблицу Товар без товаров с кодами 2 и 3. ROLLBACK TRANSACTION point1Происходит возврат в первоначальное состояние таблицы. SELECT * FROM ТоварCOMMITПервоначальное состояние сохраняется. Вложенные транзакции Вложенными называются транзакции, выполнение которых инициируется из тела уже активной транзакции. Для создания вложенной транзакции пользователю не нужны какие-либо дополнительные команды. Он просто начинает новую транзакцию, не закрыв предыдущую. Завершение транзакции верхнего уровня откладывается до завершения вложенных транзакций. Если транзакция самого нижнего (вложенного) уровня завершена неудачно и отменена, то все транзакции верхнего уровня, включая транзакцию первого уровня, будут отменены. Кроме того, если несколько транзакций нижнего уровня были завершены успешно (но не зафиксированы), однако на среднем уровне (не самая верхняя транзакция) неудачно завершилась другая транзакция, то в соответствии с требованиями ACID произойдет откат всех транзакций всех уровней, включая успешно завершенные. Только когда все транзакции на всех уровнях завершены успешно, происходит фиксация всех сделанных изменений в результате успешного завершения транзакции верхнего уровня. Каждая команда COMMIT TRANSACTION работает только с последней начатой транзакцией. При завершении вложенной транзакции команда COMMIT применяется к наиболее "глубокой" вложенной транзакции. Даже если в команде COMMIT TRANSACTION указано имя транзакции более высокого уровня, будет завершена транзакция, начатая последней. Если команда ROLLBACK TRANSACTION используется на любом уровне вложенности без указания имени транзакции, то откатываются все вложенные транзакции, включая транзакцию самого высокого (верхнего) уровня. В команде ROLLBACK TRANSACTION разрешается указывать только имя самой верхней транзакции. Имена любых вложенных транзакций игнорируются, и попытка их указания приведет к ошибке. Таким образом, при откате транзакции любого уровня вложенности всегда происходит откат всех транзакций. Если же требуется откатить лишь часть транзакций, можно использовать команду SAVE TRANSACTION, с помощью которой создается точка сохранения.
16.2. Вложенные транзакции. Здесь происходит возврат на начальное состояние таблицы, поскольку выполнение команды ROLLBACK TRAN без указания имени транзакции откатывает все транзакции.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|