Программирование >>  Oracle 

1 ... 257 258 259 [ 260 ] 261 262 263 ... 469


Автономные транзакции

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.



1 ... 257 258 259 [ 260 ] 261 262 263 ... 469

© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика