oracle php 执行时间,在执行Oracle pl/sql-oci8的PHP中,什么时候执行自动回滚?
最近不得不對(duì)此做一些測(cè)試。當(dāng)發(fā)生未處理的異常時(shí),Oracle似乎會(huì)部分回滾到包含同一會(huì)話的begin block或commit的最頂層(并非總是返回到先前的commit)。給定一個(gè)具有int id和varchar2 val和proc的表:
CREATE OR REPLACE PROCEDURE PROC_AUTO_COMMIT_TEST(
p_id int, p_val varchar2, p_cmd varchar2
) IS
BEGIN
if (p_cmd = 'init') then
delete from TEMP_AUTOCOMMIT_TEST;
insert into TEMP_AUTOCOMMIT_TEST values(1,'one');
insert into TEMP_AUTOCOMMIT_TEST values(2,'two');
insert into TEMP_AUTOCOMMIT_TEST values(3,'three');
commit;
else
update TEMP_AUTOCOMMIT_TEST
set val = p_val
where id = p_id;
if (p_cmd = 'throw') then
insert into TEMP_AUTOCOMMIT_TEST values(3,'THREE'); -- throws
end if;
end if;
END PROC_AUTO_COMMIT_TEST;
然后執(zhí)行:
begin
PROC_AUTO_COMMIT_TEST(0, null, 'init');
begin
PROC_AUTO_COMMIT_TEST(1, 'ONE', null);
end;
begin
PROC_AUTO_COMMIT_TEST(2, 'TWO', null);
PROC_AUTO_COMMIT_TEST(3, 'THREE', 'throw');
end;
end;
回滾到“init”中的提交(也回滾一個(gè))。
與按順序執(zhí)行(從toad(autocommit off,每個(gè)塊上的f9,整個(gè)塊上的f5)或sqlplus(中間有/)相比):
begin
PROC_AUTO_COMMIT_TEST(0, null, 'init');
end;
begin
PROC_AUTO_COMMIT_TEST(1, 'ONE', null);
end;
begin
PROC_AUTO_COMMIT_TEST(2, 'TWO', null);
PROC_AUTO_COMMIT_TEST(3, 'THREE', 'throw');
end;
異常發(fā)生在三個(gè)之內(nèi),然后回滾到“一”之后。但是“one”仍然需要回滾或提交,因?yàn)樗钟行墟i(通過(guò)toad中的會(huì)話瀏覽器驗(yàn)證)。將其稱為部分回滾,因?yàn)樗粫?huì)一直返回到“init”調(diào)用中的commit,并且會(huì)留下一行鎖定。我假設(shè)這個(gè)例子更接近于PHP可能正在做的事情和其他連接器。
總結(jié)
以上是生活随笔為你收集整理的oracle php 执行时间,在执行Oracle pl/sql-oci8的PHP中,什么时候执行自动回滚?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 可逆加密算法 php,php可逆加密的方
- 下一篇: php 验证座机,验证国内手机号与座机号