Oracle ddl隱式提交注意點

2021-08-31 09:04:05 字數 2434 閱讀 2799

今天在測試中意外發現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查詢之前,資料被其他使用者改變,則該次整體的統計查詢將會出現讀資料...