|
Программирование >> Oracle
Автономные транзакции Автономные транзакции позволяют создать новую транзакцию в пределах текущей, так что можно фиксировать или откатывать ее изменения независимо от родительской транзакции. Они позволяют приостановить текущую транзакцию, начать новую, выполнить ряд действий, зафиксировать их или откатить, не влияя на состояние текущей транзакции. Автономные транзакции предлагают новый метод управления транзакциями в языке PL/SQL и могут использоваться: в анонимных блоках верхнего уровня; в локальных, отдельных или входящих в пакеты процедурах и функциях; в методах объектных типов; в триггерах базы данных. Для выполнения примеров, приводимых в этой главе, необходим сервер Oracle версии 8.1.5 или выше. Подходит любая редакция - Standard, Enterprise или Personal, поскольку эта возможность поддерживается во всех редакциях. В этой главе мы: выясним, для чего используются автономные транзакции, включая реализацию проверки, записи которой нельзя откатить, предотвращение возникновения ошибок изменяющихся таблиц, запись в базу данных из оператора SELECT и повышение модульности кода; рассмотрим, как работают автономные транзакции; изучим управление транзакциями и область действия транзакций, а также то, как завершать автономную транзакцию и устанавливать точки сохранения; 1162 Глава 15 обсудим проблемы и ошибки, которых надо остерегаться при использовании автономных транзакций в приложениях. Пример Чтобы показать возможности автономных транзакций, я начну с простого примера, демонстрирующего последствия их выполнения. Создадим простую таблицу для сохранения сообщений, а также две процедуры: обычную и оформленную как автономная транзакция. Процедуры будут изменять созданную таблицу. С помощью этих объектов я продемонстрирую, какие изменения остаются (фиксируются) в базе данных в различных ситуациях: tkyte@TKYTE816> create table t (msg varchar2(2 5)) ; Table created. tkyte@TKYTE816> create or replace procedure Autonomous Insert 2 as 3 pragma autonomous transaction; 4 begin 5 insert into t values (Autonomous Insert); 6 commit; 7 end; Procedure created. tkyte@TKYTE816> create or replace procedure NonAutonomous Insert 2 as 3 begin 4 insert into t values (NonAutonomous Insert); 5 commit; 6 end; Procedure created. Процедуры просто вставляют свои имена в таблицу сообщений и фиксируют результат. Обратите внимание на использование PRAGMA AUTONOMOUS TRANSACTION. Эта директива указывает серверу, что процедура должна выполняться как новая автономная транзакция, независимо от родительской транзакции. Теперь рассмотрим поведение обычной, не автономной транзакции в анонимном блоке PL/SQL: tkyte@TKYTE816> begin 2 insert into t values (Anonymous Block); 3 NonAutonomous Insert; 4 rollback; 5 end; PL/SQL procedure successfully completed. tkyte@TKYTE816> select * from t; Автономные транзакции 1163 Anonymous Block NonAutonomous Insert Как видите, изменения, выполненные анонимным блоком (вставка строки), были зафиксированы процедурой NonAutonomousInsert. Зафиксированы обе строки данных, и оператору rollback оказалось нечего откатывать. Сравните это с поведением хранимой процедуры, оформленной как автономная транзакция: tkyte@TKYTE816> delete from t; 2 rows deleted. tkyte@TKYTE816> commit; Commit complete. tkyte@TKYTE816>begin 2 insert into t values (Anonymous Block); 3 Autonomous Insert; 4 rollback; 5 end; PL/SQL procedure successfully completed. tkyte@TKYTE816> select * from t; Autonomous Insert В данном случае остаются только изменения, выполненные и зафиксированные в автономной транзакции. Оператор INSERT, выполненный в анонимном блоке, откатывается оператором ROLLBACK в строке 4. Оператор COMMIT в процедуре - автономной транзакции не влияет на родительскую транзакцию, начатую в анонимном блоке. Этот простой пример показывает суть автономных транзакций и их возможности. При отсутствии автономных транзакций оператор COMMIT в процедуре NonAutonomous Insert зафиксировал не только выполненные в ней изменения (результат выполнения оператора INSERT),но и все остальные еще не зафиксированные изменения, выполненные в сеансе (например, вставку строки Anonymous Block, выполненную в автономном блоке). Оператор отката ничего не отменил, поскольку при вызове процедуры были зафиксированы обе вставки. В случае применения автономных транзакций все меняется. Изменения, выполненные в процедуре, объявленной как AUTONOMOUS TRANSACTION, зафиксированы, однако изменения, выполненные вне автономной транзакции, отменены. Сервер Oracle для решения своих внутренних задач поддерживает автономные транзакции уже довольно давно. Мы постоянно их видим в форме рекурсивных SQL-операторов. Например, при выборе из последовательности, не находящейся в кэше, автоматически выполняется рекурсивная транзакция, увеличивающая значение последовательности в таблице SYS.SEQ$. Изменение значения последовательности немедленно фиксируется и видимо для других транзакций, но обратившаяся к последователь-
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |