ТРАНЗАКЦИИ

 

Как правило, изменения в базе данных обусловлены реальными событиями, происходящими в предметной области требующими нескольких изменений таблиц. Например, при увольнении сотрудника требуется:

- закрепить все объекты, увольняемого сотрудника за другими сотрудниками отделения;

- удалить запись о сотруднике.

Чтобы не возникло противоречий с данными, указанные изменения следует выполнить как одно целое. Если из-за системного сбоя или другой ошибки получится, что одна часть изменений была внесена, а другая – нет, то это нарушит целостность хранимых данных. Поэтому несколько изменений базы данных, которые вызваны одним событием, необходимо вносить по принципу “либо все, либо ничего”. Это обеспечивается средствами обработки механизма транзакций.

Транзакцией называют несколько последовательных инструкций SQL, которые рассматриваются СУБД как единое целое. Каждая инструкция решает часть общей задачи, но для того, чтобы задачу можно было считать решенной, требуется выполнить все эти инструкции.

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

СУБД должна подчиняться этому правилу, даже если во время выполнения транзакции произойдет ошибка в программе или аппаратный сбой, что показано на рисунке . В любом случае должно гарантироваться, что при восстановлении базы данных после сбоя “частичное выполнение транзакции” в ней отражено не будет.

 

 

Рисунок Понятие транзакции

 

Инструкции COMMIT и ROLLBACK. В СУБД обработка транзакций реализована с помощью двух инструкций:

- инструкция COMMIT сообщает об успешном окончании транзакции. Она информирует СУБД о том, что транзакция завершена, все инструкции, входящие в ее состав, выполнены успешно и противоречия в базе данных не возникли;

- инструкция ROLLBACK сообщает о неуспешном окончании транзакции. Она информирует СУБД о том, что пользователь не будет завершать транзакцию; все изменения, внесенные в базу данных в результате выполнения транзакции, должны быть отменены, т.е. СУБД должна возвратить базу данных в состояние, в котором она находилась до начала транзакции.

Инструкции COMMIT и ROLLBACK являются такими же инструкциями SQL, как и SELECT, INSERT или UPDATE. Однако в отличие от инструкций, изменяющих данные в базе, инструкции управления транзакциями редко употребляются в интерактивном режиме. При интерактивной обработке смысл их применения становится очевидным в контексте параллельной работы с сетевой базой данных нескольких пользователей.

Проверка успешности выполнения инструкций, входящих в транзакцию, выполнение отката транзакции (ROLLBACK) или подтверждение ее успешного выполнения (COMMIT) осуществляется обычно программно, посредством специально разработанных и стандартизированных интерфейсов (например, ODBC API – Open Database Connectivity, Application Programming Interface – открытый доступ к БД, интерфейс прикладного программирования, который является отраслевым стандартом). В функцию интерфейсов помимо пересылки по сети пользовательских запросов входит также обеспечение корректного соединения с БД на основе существующих сетевых протоколов, а также предварительная обработка запросов, включающая их грамматический разбор и “связывание” параметров в предложениях WHERE.

Модель транзакции в стандарте ANSI/ISO.В стандарте ANSI/ISO определена модель транзакции, а также указаны задачи инструкций COMMIT и ROLLBACK. В большинстве коммерческих СУБД используется именно эта модель, которая была создана на основе модели, принятой в СУБД DB2. В стандарте говорится, что транзакция автоматически начинается с выполнения пользователем или программой первой инструкции SQL. Далее происходит последовательное выполнение остальных инструкций SQL до тех пор, пока транзакция не завершится одним из четырех способов:

- Инструкция COMMIT завершает выполнение текущей транзакции. Изменения, внесенные в базу данных, становятся постоянными. Новая транзакция начинается непосредственно после инструкции COMMIT.

- Инструкция ROLLBACK отменяет выполнение текущей транзакции. Произведенные изменения отменяются. Новая транзакция начинается непосредственно после инструкции ROLLBACK.

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

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

 

Рисунок Модель транзакции в стандарте ANSI/ISO

 

Отметим, что, согласно модели транзакции в стандарте ANSI/ISO, пользователь или программа могут выполнить транзакцию всегда. Чтобы начать транзакцию, не требуется предпринимать никаких специальных действий; транзакция начинается автоматически вместе с первой инструкцией SQL или непосредственно после окончания предыдущей транзакции.

В стандарте ANSI/ISO существует понятие программного SQL, т.е. SQL предназначенного для использования в прикладных программах. В программном SQL транзакции играют важную роль, поскольку даже в простых прикладных программах для выполнения определенной задачи часто приходится применять последовательность из двух или трех инструкций. В связи с тем, что пользователь может изменить принятое решение или могут возникнуть какие-либо другие обстоятельства (например, на складе отсутствует продукция, которую пользователь хочет заказать), прикладная программа после частичного выполнения транзакции должна иметь возможность выбора: либо выполнить транзакцию до конца, либо отменить ее. Инструкции COMMIT и ROLLBACK обеспечивают именно такую возможность.

Как уже указывалось, инструкции COMMIT и ROLLBACK можно использовать и в интерактивном режиме, но на практике это случается редко. Обычно интерактивный режим применяется для запросов на выборку и гораздо реже – для запросов на изменение; изменения, состоящие из нескольких инструкций, практически никогда не вводятся в интерактивном режиме. На самом деле во многих интерактивных СУБД по умолчанию установлен режим “автоматического завершения”, при котором инструкция COMMIT автоматически выполняется после каждой инструкции SQL, вводимой пользователем. В результате каждая инструкция SQL становится отдельной транзакцией. В СУБД ORACLE при работе в интерактивном режиме после ввода последовательно нескольких инструкций по изменению содержимого базы данных необходимо указывать инструкцию COMMIT, иначе произведенные изменения будут зафиксированы только в журнале транзакций, т.е. они не будут иметь “постоянного” характера, так как данные таблиц останутся без изменений.

 

 








Дата добавления: 2015-08-26; просмотров: 1215;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.006 сек.