|
Программирование >> Oracle
Автономные транзакции 1191 10 commit; 11 end; 12 / Procedure created. tkyte@TKYTE816> create or replace procedure parent 2 as 4 begin 5 11 end; 12 / l ename emp.ename%type; select ename into l ename from emp where ename = KING FOR UPDATE; child; commit; Procedure created. tkyte@TKYTE816> exec parent BEGIN parent; END; ERROR at line 1: ORA-00060: deadlock detected while waiting for resource ORA-06512: at TKYTE.CHILD , line 6 ORA-06512: at TKYTE.PARENT , line 9 ORA-06512: at line 1 Необходимо проявлять осторожность и не допускать взаимного блокирования родительской и порожденной транзакций. Порожденная транзакция в этом случае всегда проигрывает , и соответствующий ее оператор откатывается. Завершение автономной транзакции Для завершения автономной транзакции необходимо выполнять операторы COMMIT или ROLLBACK, или оператор ЯОД, который автоматически фиксирует транзакцию. Сама автономная транзакция начинается автоматически при выполнении изменения в базе данных, блокировании ресурсов или выполнении оператора управления транзакцией, такого как SET TRANSACTION или SAVEPOINT. Автономная транзакция должна быть явно завершена, прежде чем управление вернется в родительскую транзакцию (иначе выдается сообщение об ошибке). Отката до точки сохранения (ROLLBACK TO SAVEPOINT) недостаточно, даже если в результате незафиксированных изменений не остается, поскольку при этом не завершается транзакция. Если автономная транзакция завершается нормально (а не путем распространения исключительной ситуации) и в ней не выполнен оператор COMMIT или ROLLBACK, выдается следующее сообщение об ошибке: tkyte@TKYTE816> create or replace procedure child 2 as 3 pragma autonomous transaction; 4 l ename emp.ename%type; 1192 Глава 15 10 11 begin end; select ename into l ename from emp where ename = KING FOR UPDATE; Procedure created. tkyte@TKYTE816> exec child BEGIN child; END; ERROR at line 1: ORA-06519: active autonomous transaction detected and rolled back ORA-06512: at TKYTE.CHILD , line 6 ORA-06512: at line 1 Так что в случае автономной транзакции следует не только избегать взаимных блокировок с родительской, но и позаботиться о ее чистом завершении (чтобы предотвратить откат всех изменений). Точки сохранения В главе 4, посвященной транзакциям, я описывал точки сохранения и их влияние на выполняемые приложением транзакции. Точки сохранения действуют только в пределах текущей транзакции. Это означает, что нельзя откатить автономную транзакцию до точки сохранения, установленной в транзакции вызывающей подпрограммы. Этой точки сохранения нет в среде текущей автономной транзакции. Давайте посмотрим, что получится, если попытаться выполнить такой откат: tkyte@TKYTE816> create or replace procedure child 6 7 8 9 10 11 begin end; pragma autonomous transaction; l ename emp.ename%type; update emp set ename = y where ename rollback to Parent Savepoint; commit; BKE ; Procedure created. tkyte@TKYTE816> create or replace procedure parent 2 as 3 l ename emp.ename%type; 4 begin 5 savepoint Parent Savepoint; 6 update emp set ename = x where ename = KING; child; rollback; Автономные транзакции 1193 10 end; 11 / Procedure created. tkyte@TKYTE816> exec parent BEGIN parent; END; ERROR at line 1: ORA-01086: savepoint PARENT SAVEPOINT never established ORA-0 6512: at TKYTE.CHILD , line 8 ORA-06512: at TKYTE.PARENT , line 8 ORA-06512: at line 1 Для автономной транзакции эта точка сохранения никогда не устанавливалась. Если удалить признак автономной транзакции из представленной выше процедуры child и повторно выполнить процедуру parent, все успешно сработает. Автономная транзакция не может изменять состояние родительской транзакции. Это не означает, что в автономной транзакции нельзя использовать точки сохранения. Можно. Нужно только устанавливать собственн1е точки сохранения. Например, следующий код демонстрирует, что установленная в порожденной транзакции точка сохранения работает. Одно изменение, выполненное до точки сохранения, осталось, а другое - отменено, как и предполагалось: tkyte@TKYTE816> create or replace procedure child begin 10 11 12 end; 13 / pragma autonomous transaction; l ename emp.ename%type; update emp set ename = у where ename savepoint child savepoint; update emp set ename = z where ename rollback to child savepoint; commit; SMITH; Procedure created. tkyte@TKYTE816> create or replace procedure parent begin 10 end; 11 / l ename emp.ename%type; savepoint Parent Savepoint; update emp set ename = x where ename child; commit; KING ; Procedure created.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |