|
Программирование >> Oracle
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) таблиц необходимо учитывать, что временные таблицы уровня транзакции нельзя одновременно использовать в нескольких транзакциях в одном сеансе. Временные таблицы управляются на уровне сеанса и при создании их на уровне транзакции (с удалением всех строк при фиксации)
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |