Из любопытства я сделал простой тест, чтобы подтвердить, что обработка страницы происходит в одну транзакцию:
0. Создал таблицу и пакет для лога.
create table processing_steps (ordr number, msg varchar2(1000 char));
create or replace package proc_stp_pkg
as
procedure reset;
procedure add(p_ordr number, p_msg varchar2);
procedure add_auton(p_ordr number, p_msg varchar2);
end proc_stp_pkg;
/
create or replace package body proc_stp_pkg
as
procedure reset
is
pragma autonomous_transaction;
begin
delete processing_steps;
commit;
end;
procedure add(p_ordr number, p_msg varchar2)
is
begin
insert into processing_steps(ordr, msg) values (p_ordr, p_msg);
end;
procedure add_auton(p_ordr number, p_msg varchar2)
is
pragma autonomous_transaction;
begin
add(p_ordr=>p_ordr, p_msg=>p_msg);
commit;
exception
when others then
rollback;
raise;
end;
end proc_stp_pkg;
/1. Создал в APEX страницу с процессом перед проверками, вычислением, проверкой и процессом после вычисления. В каждом из них есть строки:
rollback; proc_str_pkg.add(..., '...'); proc_str_pkg.add_auton(..., '...');
2. Добавил кнопку и переход на эту же страницу при нажатии.
3. Запустил страницу и нажал на кнопку.
4. Выполнил запрос:
SQL> set pages 9999 line 200
SQL> column msg format a50
SQL> select * from processing_steps
2 order by ordr;
ORDR MSG
---------- --------------------------------------------------
1 Pr: On Submit - Before Computations and Validation
s - Autonomous Transaction
3 Computation - Autonomous Transaction
5 Validation - Autonomous Transaction
6 Pr: On Submit - After Computations and Validations
7 Pr: On Submit - After Computations and Validations
- Autonomous Transaction
SQL>Пропущенные вставки 0, 2 и 4 откатывались оператором ROLLBACK в последующих блоках обработки. Вставка 6 автоматически зафиксировалась при успешном выполнении последнего блока. Так что будьте осторожней, управляя фиксацией и откатом в Вашем коде - Вы можете повлиять на результаты предыдущих блоков.

Комментариев нет:
Отправить комментарий