Oracle ddl隱式提交注意點

zecaro發表於2011-06-11

之前我對於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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章