Создадим две таблицы:
create table kk_ordinal_table(id number);
create table kk_autonomous_commiting_table(id number);
С использованием директивы 'PRAGMA AUTONOMOUS_TRANSACTION' напишем процедуру kk_autonomous_insert, которая будет commit-ить вставку в таблицу kk_autonomous_commiting_table, но не будет при этом commit-ить вызвавшую kk_autonomous_insert внешнюю транзакцию:
create or replace procedure kk_autonomous_insert(p_id integer) as
PRAGMA AUTONOMOUS_TRANSACTION;
begin
insert into kk_autonomous_commiting_table (id) values (p_id);
commit;
end kk_autonomous_insert;
В первой сессии выполняем сделующий блок. dbms_lock.sleep(10) - это 10 секунд безделия:
begin
dbms_lock.sleep(10);
insert into kk_ordinal_table (id) values (1);
kk_autonomous_insert(1);
dbms_lock.sleep(10);
insert into kk_ordinal_table (id) values (2);
kk_autonomous_insert(2);
dbms_lock.sleep(10);
insert into kk_ordinal_table (id) values (3);
kk_autonomous_insert(3);
commit;
end;
Во второй сессии во время выполнения вышеприведенного анонимного блока следует смотреть на то, как попадают данные в таблицы kk_ordinal_table и kk_autonomous_commiting_table. В kk_ordinal_table данные мы увидим только через 30 секунд (после commit в вызванном блоке), а в kk_autonomous_commiting_table будет появляться по одной строке каждые 10 секунд.
select * from kk_ordinal_table;
select * from kk_autonomous_commiting_table;
При желании можно сделать
truncate table kk_ordinal_table;
truncate table kk_autonomous_commiting_table;
и повторить эксперимент.