欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > php >内容正文

php

oracle php 执行时间,在执行Oracle pl/sql-oci8的PHP中,什么时候执行自动回滚?

发布时间:2025/4/16 php 40 豆豆
生活随笔 收集整理的这篇文章主要介绍了 oracle php 执行时间,在执行Oracle pl/sql-oci8的PHP中,什么时候执行自动回滚? 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

最近不得不对此做一些测试。当发生未处理的异常时,Oracle似乎会部分回滚到包含同一会话的begin block或commit的最顶层(并非总是返回到先前的commit)。给定一个具有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;

然后执行:

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”中的提交(也回滚一个)。

与按顺序执行(从toad(autocommit off,每个块上的f9,整个块上的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;

异常发生在三个之内,然后回滚到“一”之后。但是“one”仍然需要回滚或提交,因为它持有行锁(通过toad中的会话浏览器验证)。将其称为部分回滚,因为它不会一直返回到“init”调用中的commit,并且会留下一行锁定。我假设这个例子更接近于PHP可能正在做的事情和其他连接器。

总结

以上是生活随笔为你收集整理的oracle php 执行时间,在执行Oracle pl/sql-oci8的PHP中,什么时候执行自动回滚?的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。