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

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


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;



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

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