В Oracle нет необходимости в операторе “начала транзакции”. Транзакция начинается неявно с первым же оператором, который модифицирует данные (первый оператор, получающий блокировку TX). Вы можете явно начать транзакцию, используя команду SET TRANSACTION или пакет DBMS_TRANSACTION, но этот шаг в Oracle не обязателен, в отличие от различных прочих СУБД. Оператор COMMIT или ROLLBACK явно завершает транзакцию.
На заметку! Команда ROLLBACK TO SAVEPOINT не завершает транзакцию! Только полная правильная команда ROLLBACK может ее завершить.
Вы всегда должны явно завершать транзакцию с помощью COMMIT или ROLLBACK, в противном случае инструмент/среда, используемая вами, самостоятельно выберет то или другое за вас. Если вы нормально выходите их сеанса SQL*Plus, без фиксации или отката, то SQL*Plus предполагает, что вы хотите зафиксировать вашу работу и делает это. С другой стороны, если вы выходите из программы Pro*C, то имеет место неявный откат транзакции. Никогда не полагайтесь на неявное поведение, потому что в будущем оно может измениться. Всегда завершайте явно свои транзакции командами COMMIT или ROLLBACK.
Транзакции в Oracle атомарны — в том смысле, что каждый оператор, составляющий транзакцию, фиксируется (становится постоянным) или же происходит откат их всех. Эта защита распространяется также и на индивидуальные операторы. Весь оператор либо полностью успешен, либо полностью неудачен. Обратите внимание, что я сказал, что “оператор” откатывается. Сбой одного оператора не вызывает автоматического отката всех предыдущих операторов. Их работа предохраняется и должна быть либо зафиксирована, либо отменена (путем отката) вами. Прежде чем мы обратимся к деталям относительно того, что означает атомарность для оператора и транзакции, давайте рассмотрим различные операторы управления транзакциями, которые доступны нам.
COMMIT. Чтобы использовать простейшую форму этого оператора, вы просто пишете COMMIT. Можно применить более многословную форму и записать COMMIT WORK, но эти две формы эквивалентны. COMMIT завершает вашу транзакцию и фиксирует все проведенные в ней изменения как постоянные. Существуют расширения оператора COMMIT для распределенных транзакций. Эти расширения позволяют вам пометить COMMIT некоторым осмысленным комментарием и принудительно зафиксировать распределенную транзакцию.
• ROLLBACK. Чтобы использовать простейшую форму этого оператора, вы просто пишете ROLLBACK. Опять же, существует более многословный вариант ROLLBACK WORK, но эти формы эквивалентны. Откат (rollback) завершает вашу транзакцию и отменяет все незафиксированные изменения, проведенные в
ней. Это делается посредством чтения информации, хранящейся в сегментах отката/отмены (я пойду дальше, и стану называть их сегментами отмены (undo segments), как это принято в терминологии Oracle 10g) и восстановления блоков базы данных в состояние, в котором они пребывали до начала транзакции. SAVEPOINT. SAVEPOINT позволяет вам создать “маркерную точку” внутри транзакции. В одной транзакции можно иметь множество таких точек.
ROLLBACK TO <SAVEPOINT>. Этот оператор применяется вместе с командой SAVEPOINT. Вы можете откатить транзакцию к этой маркерной точке, не откатывая работу, выполненную до нее. Таким образом, вы можете написать два оператора UPDATE, за которыми следует SAVEPOINT, и затем — два оператора DELETE. Если ошибка или любого рода исключительная ситуация случится во время выполнения операторов DELETE, вы можете перехватить исключение и выполнить команду ROLLBACK TO SAVEPOINT— транзакция откатится к именованной SAVEPOINT, отменяя всю работу, выполненную операторами DELETE, но оставляя в силе то, что сделано операторами UPDATE.
SET TRANSACTION. Этот оператор позволяет устанавливать различные транзакционные атрибуты, такие как уровень изоляции транзакции и указание на то, является ли она транзакцией только для чтения или для чтения-записи. Вы можете также применять этот оператор для того, чтобы заставить транзакцию использовать специфический сегмент отката при ручном управлении отменой, хотя это и не рекомендуется. Автоматическое и ручное управление отменой мы рассмотрим более подробно в главе 9.
Вот и все, больше нет никаких других операторов управления транзакциями. Наиболее часто используемые управляющие операторы — это COMMIT и ROLLBACK. Оператор SAVEPOINT имеет довольно-таки специальное назначение. Внутренне Oracle использует его часто, и вы также можете найти ему применение в своих приложениях.
< Предыдущая | Следующая > |
---|