|
Программирование >> Oracle
1188 Глава 15 26 27 28 29 30 31 32 33 34 3 5 40 41 42 43 44 create or replace package body my pkg cursor global cursor is select ename from emp; procedure show results is pragma autonomous transaction; l ename emp.ename%type; begin tkyte@TKYTE816> 2 as 3 4 9 10 11 12 13 14 15 16 17 18 19 23 24 if (global cursor%isopen) then dbms output.put line(Еще НЕ открытый курсор) ; else dbms output.put line(Уже открытый) ; open global cursor; end if; loop fetch global cursor into l ename; exit when global cursor%notfound; dbms output.put line(l ename); end loop; close global cursor; end; procedure is begin update emp set ename open global cursor; show results; show results; rollback; end; end; Package body created. tkyte@TKYTE816> exec my pkg.run Еще НЕ открытый курсор Автономные транзакции 1189 Уже открытый SMITH MILLER PL/SQL procedure successfully completed. Когда курсор открыт в родительской транзакции, в автономной транзакции можно получить незафиксированные строки - все значения х. Курсор, отрытый в автономной транзакции, с таким же успехом можно было открыть и в другом сеансе - для него эти незафиксированные данные недоступны. Мы видим данные в том состоянии, в каком они были до изменения. Итак, этот пример показывает, как автономная транзакция будет реагировать на незафиксированные изменения в родительской транзакции при выполнении операторов SELECT. А будут ли в родительской транзакции видны изменения, произошедшие в автономной транзакции? Это будет зависеть от уровня изолированности родительской транзакции. При использовании стандартного уровня изолированности, READ COMMITTED, родительская транзакция сможет увидеть эти изменения. При использовании уровня изолированности SERIALIZABLE эти изменения не будут видны, хотя они выполнены в том же сеансе. Например: tkyte@TKYTE816> create table t (msg varchar2(4ООО)) ; Table created. tkyte@TKYTE816> create or replace procedure auto proc 2 as 3 pragma autonomous transaction; 4 begin 5 insert into t values (A row for you) ; 6 commit; 7 end; Procedure created. tkyte@TKYTE816> create or replace 2 procedure proc(read committed in boolean) 3 as 4 begin 5 if (read committed) then 6 set transaction isolation level read committed; 7 else 8 set transaction isolation level serializable; 9 end if; 11 auto proc; 12 13 dbms output.put line(-) ; 14 for x in (select * from t) loop 15 dbms output.put line(x.msg); 16 end loop; 17 dbms output.put line(-) ; 18 commit; 1190 Глава 15 19 end; 20 / Procedure created. tkyte@TKYTE816> exec proc(TRUE) A row for you PL/SQL procedure successfully completed. tkyte@TKYTE816> delete from t; 1 row deleted. tkyte@TKYTE816> commit; Commit complete. tkyte@TKYTE816> exec proc(FALSE) PL/SQL procedure successfully completed. Как видите, при выполнении процедуры в режиме READ COMMITTED зафиксированные изменения видны. При выполнении в режиме SERIALIZABLE изменения не видны. Дело в том, что изменения, выполненные в автономной транзакции, выполнены в другой транзакции, а уровень изолированности SERIALIZABLE требует учитывать только изменения, выполненные в данной транзакции (при этом уровне изолированности все обстоит так, как если бы транзакция была единственной - изменения, выполненные в других транзакциях, не видны). Блоковки В предыдущем разделе мы разобрались, что происходит при попытке чтения в порожденной автономной транзакции зафиксированных и незафиксированных изменений, выполненных родительской транзакцией, а также при чтении в родительской транзакции изменений, выполненных порожденной транзакцией. Теперь посмотрим, какие при этом устанавливаются блокировки. Поскольку родительская и порожденная - это две абсолютно разные транзакции, они никак не могут совместно использовать блокировки. Если родительская транзакция заблокировала ресурс, который требуется заблокировать также порожденной автономной транзакции, произойдет взаимное блокирование в сеансе. Следующий пример демонстрирует эту проблему: tkyte@TKYTE816> create or replace procedure child 2 as 3 pragma autonomous transaction; 4 l ename emp.ename%type; 5 begin 6 select ename into l ename 7 from emp 8 where ename - KING 9 FOR UPDATE;
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |