| 之前我对于ddl的隐式提交也仅限于ddl操作成功,则隐式提交。看了这篇文章,然后试了一下( Oracle 10.2.0.5.0 - 64bit),确如文章中所述。MARK~ |
来自:http://itspace.iteye.com/blog/1000379
文章分类:数据库
今天在测试中意外发现Oracle ddl隐式提交需要注意的地方。我们都知道,在同一个会话中,ddl执行之前,会隐式进行commit操作。但之前的理解一直局限于这个ddl操作成功,之前的事务才隐式提交,但今天所做的测试,看来并非如此。
场景1:
Oracle ddl通过语法检查,但对象不存在。
在一号会话中:
引用SQL> select * from zhoul;
I NAME
---------- --------------------
1 bbb
2 bbb
3 bbb
SQL> update zhoul set i=1*8 where i=1;
1 row updated.
发布一条符合ddl语法的语句,只是表格yuiyiuyiuyui不存在
引用SQL> drop table yuiyiuyiuyui;
drop table yuiyiuyiuyui
*
ERROR at line 1:
ORA-00942: table or view does not exist
在二号会话中查看事务已经提交:
引用SQL> select * from zhoul;
I NAME
---------- --------------------
8 bbb
2 bbb
3 bbb
经过以上测试,可以看出对于ddl语句,只要经过语法检查,还会进行隐式提交。
场景2:
Oracle ddl通过语法检查,但对象没有相应权限在一号会话中:
引用SQL> select * from zhoul;
I NAME
---------- --------------------
1 bbb
2 bbb
3 bbb
SQL> select count(*) from sys.testddl;
COUNT(*)
----------
10
SQL> update zhoul set i=1*8 where i=1;
1 row updated.
没有drop sys.testddl对象权限
引用SQL> drop table sys.testddl;
drop table sys.testddl
*
ERROR at line 1:
ORA-01031: insufficient privileges
在二号会话中查看事务已经提交:
引用SQL> select * from zhoul;
I NAME
---------- --------------------
8 bbb
2 bbb
3 bbb
场景3:
如果ddl语句不通过语法检查,那会出现什么情况呢?
在一号会话中:
引用SQL> select * from zhoul;
I NAME
---------- --------------------
1 bbb
2 bbb
3 bbb
SQL>
SQL> update zhoul set i=1*8 where i=1;
1 row updated.
发布一条不符合语法的ddl语句
引用SQL> drop tablw dss;
drop tablw dss
*
ERROR at line 1:
ORA-00950: invalid DROP option
在二号会话中可以看到并没有进行隐式提交。
引用SQL> select * from zhoul;
I NAME
---------- --------------------
1 bbb
2 bbb
3 bbb
综上所述:
ddl总是提交在它之前正在进行的工作,从伪代码角度来讲,ddl进行如下处理:
begin
commit;
parse the ddl --verify privileages and syntax
begin
do_the_ddl;
commit;
exception
when others then
rollback;
end;
end;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23650854/viewspace-697662/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/23650854/viewspace-697662/
本文探讨了Oracle数据库中DDL(数据定义语言)操作的隐式提交行为。实验表明,即使DDL操作失败或因权限不足而无法执行,之前的操作也会被隐式提交。但如果DDL语句本身语法错误,则不会触发隐式提交。
655

被折叠的 条评论
为什么被折叠?



