Логика фиксации / отката в PL / SQL (независимо от условия AUTONOMOUS TRANSACTION -> НЕ ИСПОЛЬЗУЙТЕ ЭТО, если вы не ведете журнал ошибок: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:2212445691154)
Итак, если вы отправите COMMIT в вашем пакете, ваши данные будут переданы, PERIOD. Откатить так же.
Создать таблицу для следующих примеров:
create table SHOW_TRANSACTION (MISC varchar2(15)) ;
/
Глядя на этот пример, видно, что:
declare
procedure DOTHEINSERT(DATAM in SHOW_TRANSACTION.MISC%type ,
doCommit IN boolean
)
as
begin
insert into SHOW_TRANSACTION (MISC)
values (DATAM);
if DOCOMMIT then
commit ;
else
ROLLBACK ;
end if;
end ;
begin
DOTHEINSERT('commit1' , true);
DOTHEINSERT('NOcommit1' , false);
DOTHEINSERT('commit2' , true);
DOTHEINSERT('NOcommit2' , false);
DOTHEINSERT('commit3' , true);
ROLLBACK;
end ;
/
select * from SHOW_TRANSACTION ;
/
MISC
---------------
commit1
commit2
commit3
Обратите внимание, что окончательный ROLLBACK ничего не делает? это потому, что COMMIT / ROLLBACKS в процедуре влияют на всю область видимости, посмотрите на этот пример:
truncate table SHOW_TRANSACTION; --start with clean slate
declare
procedure DOTHEINSERT(DATAM in SHOW_TRANSACTION.MISC%type ,
doCommit IN boolean
)
as
begin
insert into SHOW_TRANSACTION (MISC)
values (DATAM);
if DOCOMMIT then
commit ;
--else (HERE I AM GETTING RID OF THE PROCEDURES ROLLBACK, SO EVERYTHING IS BEING ROLLBACK'ED
-- ROLLBACK ;
end if;
end ;
begin
DOTHEINSERT('commit1' , true);
DOTHEINSERT('NOcommit1' , false);
DOTHEINSERT('commit2' , true);
DOTHEINSERT('NOcommit2' , false);
DOTHEINSERT('commit3' , true);
ROLLBACK;
end ;
/
select * from SHOW_TRANSACTION ;
/
MISC
---------------
commit1
NOcommit1
commit2
NOCOMMIT2
commit3
Здесь пакет ROLLBACK удаляется, поэтому, когда происходит этот COMMIT, содержимое всех вставок до этого вставляется.
Если вы хотите, чтобы приложение VB обрабатывало транзакцию, вы должны удалить commit / rollback из PL / SQL.
Кроме того, не имеет значения, где находится фиксация / откат, они указывают на ВЕСЬ ОБЪЕМ всех элементов транзакции:
truncate table SHOW_TRANSACTION ;
declare
procedure DOTHEINSERT(DATAM in SHOW_TRANSACTION.MISC%type ,
doCommit IN boolean
)
as
procedure DOTHETRANSACTION(doCommit IN boolean) as
begin
if DOCOMMIT then
commit ;
else -- (HERE I AM GETTING RID OF THE PROCEDURES ROLLBACK, SO EVERYTHING IS BEING ROLLBACK'ED
ROLLBACK ;
end if;
END DOTHETRANSACTION;
begin
insert into SHOW_TRANSACTION (MISC)
values (DATAM);
DOTHETRANSACTION(doCommit);
end DOTHEINSERT;
begin
DOTHEINSERT('commit1' , true);
DOTHEINSERT('NOcommit1' , false);
DOTHEINSERT('commit2' , true);
DOTHEINSERT('NOcommit2' , false);
DOTHEINSERT('commit3' , true);
ROLLBACK;
end ;
/
select * from SHOW_TRANSACTION ;
/
MISC
---------------
commit1
COMMIT2
commit3
/ * теперь транзакция находится в подпрограмме sub / sub * /