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中,什么时候执行自动回滚?的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 可逆加密算法 php,php可逆加密的方
- 下一篇: php 验证座机,验证国内手机号与座机号