今天在測試中意外發現oracle ddl隱式提交需要注意的地方。我們都知道,在同乙個會話中,ddl執行之前,會隱式進行commit操作。但之前的理解一直侷限於這個ddl操作成功,之前的事務才隱式提交,[color=red]但今天所做的測試,看來並非如此。[/color]
場景1:
oracle ddl通過語法檢查,但物件不存在。
在一號會話中:
[quote]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.[/quote]
發布一條符合ddl語法的語句,只是**yuiyiuyiuyui不存在
[quote]sql> [color=red]drop table yuiyiuyiuyui;[/color]
drop table yuiyiuyiuyui
*error at line 1:
ora-00942: table or view does not exist[/quote]
在二號會話中檢視事務已經提交:
[quote]sql> select * from zhoul;
i name
---------- --------------------
8 bbb
2 bbb
3 bbb[/quote]
經過以上測試,可以看出對於ddl語句,只要經過語法檢查,還會進行隱式提交。
場景2:
oracle ddl通過語法檢查,但物件沒有相應許可權
在一號會話中:
[quote]sql> select * from zhoul;
i name
---------- --------------------
1 bbb
2 bbb
3 bbb
sql> select count(*) from sys.testddl;
count(*)
----------
10sql> update zhoul set i=1*8 where i=1;
1 row updated.[/quote]
沒有drop sys.testddl物件許可權
[quote]sql> drop table sys.testddl;
drop table sys.testddl
*error at line 1:
ora-01031: insufficient privileges[/quote]
在二號會話中檢視事務已經提交:
[quote]sql> select * from zhoul;
i name
---------- --------------------
8 bbb
2 bbb
3 bbb[/quote]
場景3:
如果ddl語句不通過語法檢查,那會出現什麼情況呢?
在一號會話中:
[quote]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.[/quote]
發布一條不符合語法的ddl語句
[quote]sql> drop tablw dss;
drop tablw dss
*error at line 1:
ora-00950: invalid drop option[/quote]
在二號會話中可以看到並沒有進行隱式提交。
[quote]sql> select * from zhoul;
i name
---------- --------------------
1 bbb
2 bbb
3 bbb[/quote]
綜上所述:
ddl總是提交在它之前正在進行的工作,從偽**角度來講,ddl進行如下處理:
begin
[color=red]commit;[/color]
parse the ddl --verify privileages and syntax
begin
do_the_ddl;
[color=red]commit;[/color]
exception
when others then
rollback;
end;
end;
Oracle DDL自動提交
oracle中,ddl語句會自動提交 隱式提交 而dml則需要手動提交 顯示提交 ddl除了包含常見的 create table view index syn cluster 之外,還包括 truncate 而dml操作包括 insert update delete rename drop alte...
顯示提交 和 隱式提交
我發現有人經常 濫用 oracle 中的commit和rollback的用法。首先,大家要清楚 commit rollback,都是用在執行 dml 語句之後的。所謂 dml 語句就是 insert delete update select 而 create table view 之類的語句,是 d...
隱式事務 自動提交事務
如果你一次執行單條查詢語句,則沒有必要啟用事務支援,資料庫預設支援sql執行期間的讀一致性 如果你一次執行多條查詢語句,例如統計查詢,報表查詢,在這種場景下,多條查詢sql必須保證整體的讀一致性,否則,在前條sql查詢之後,後條sql查詢之前,資料被其他使用者改變,則該次整體的統計查詢將會出現讀資料...