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

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


1194

Глава 15

tkyte@TKYTE816> select ename

2 from emp

3 where ename in (зс, y, z, BLAKE, SMITH, KING); ENAME

SMITH BLAKE

KING

tkyte@TKYTE816> exec parent

PL/SQL procedure successfully completed.

tkyte@TKYTE816> select ename

2 from emp

3 where ename in (, y, z, BLAKE, SMITH, KING);

ENAME

SMITH

Проблемы

При использовании автономных транзакций имеется ряд нюансов, которые надо учитывать. В этом разделе мы рассмотрим их поочередно: какие возможности недоступны в автономных транзакциях, в каких средах автономные транзакции можно использовать, особенности, с которыми можно столкнуться при их использовании и другие подобные проблемы.

Невозможность использования в распределенных транзакциях

В текущих версиях (по крайней мере до Oracle 8.1.7) не допускается использование автономных транзакций в распределенной транзакции. Четкого сообщения об ошибке при этом не выдается. Во многих (но не во всех) случаях возникает внутренняя ошибка. В будущем планируется обеспечить надежную поддержку использования автономных транзакций в распределенных. Пока же, если используются связи базы данных, об автономных транзакциях лучше забыть.

Только в среде PL/SQL

Автономные транзакции доступны только в среде PL/SQL. Их можно перенести в Java и другие языки, вызвав соответствующую подпрограмму из блока PL/SQL, оформленного как автономная транзакция. Поэтому, если необходимо создать хранимую процедуру на языке Java, работающую как автономная транзакция, создают хранимую процедуру на PL/SQL, оформленную в виде автономной транзакции, и вызывают Java-процедуру из нее.



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

Откатывается вся транзакция

Если автономная транзакция завершается из-за ошибки, вследствие неперехвачен-ной и необработанной исключительной ситуации, откатывается вся транзакция, а не только оператор, при выполнении которого произошла ошибка. Это означает, что при в1полнении автономной транзакции вы получаете все или ничего . Либо все изменения успешно фиксируются, либо возникает необработанная исключительная ситуация, и все незафиксированн1е изменения пропадают. Обратите внимание: незафиксирован-изменения. В коде, оформленном как автономная транзакция, фиксация может выполняться многократно, и откатываются только незафиксированные изменения. Обычно, если при вызове процедуры возникает исключительная ситуация, которая перехватывается и обрабатывается в вызывающем коде, незафиксированные изменения остаются, но не в случае автономной транзакции. Например:

tkyte@TKYTE816> create table t (msg varchar2(25));

Table created.

tkyte@TKYTE816> create or replace procedure auto proc

2 as

3 pragma AUTONOMOUS TRANSACTION;

4 x number;

5 begin

6 insert into t values (AutoProc);

7 x := a; - При выполнении этого оператора произойдет ошибка

8 commit;

9 end;

10 /

Procedure created.

tkyte@TKYTE816> create or replace procedure Regular Proc

2 as

3 x number;

4 begin

5 insert into t values (RegularProc);

6 x := a; - При выполнении этого оператора произойдет ошибка

7 commit;

8 end;

Procedure created. tkyte@TKYTE816> set serveroutput on

tkyte@TKYTE816> begin

2 insert into t values (Anonymous);

3 auto proc;

4 exception

5 when others then

6 dbms output.put line(Перехвачена ошибка:);

7 dbms output.put line(sqlerrm);

8 commit;

9 end;

10 /



1196

Глава 15

Перехвачена ошибка:

ORA-06502: PL/SQL: numeric or value error: character to number conversion error

PL/SQL procedure successfully completed. tkyte@TKYTE816> select * from t;

Anonymous

Сохранились только данные, вставленные в анонимном блоке. Сравните это с поведением обычного блока:

tkyte@TKYTE816> delete from t;

1 row deleted. tkyte@TKYTE816> commit; Commit complete.

tkyte@TKYTE816> begin

2 insert into t values (Anonymous);

3 regular proc;

4 exception

5 when others then

6 dbms output.put line(Перехвачена ошибка:) ;

7 dbms output.put line(sqlerrm);

8 commit;

9 end; 10 /

Перехвачена ошибка:

ORA-06502: PL/SQL: numeric or value error: character to number conversion ->error

PL/SQL procedure successfully completed. tkyte@TKYTE816> select * from t;

Anonymous RegularProc

В данном случае, поскольку ошибка перехвачена и обработана, в таблице остались строки, вставленные как анонимным блоком, так и завершившейся ошибкой процедурой.

Это означает, что нельзя просто добавить прагму AUTONOMOUS TRANSACTION в существующие хранимые процедуры в надежде, что они будут работать как прежде. Могут появиться существенные отличия.

Временные таблицы уровня транзакции

При использовании временных (GLOBAL TEMPORARY) таблиц необходимо учитывать, что временные таблицы уровня транзакции нельзя одновременно использовать в нескольких транзакциях в одном сеансе. Временные таблицы управляются на уровне сеанса и при создании их на уровне транзакции (с удалением всех строк при фиксации)



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

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