Oracle的DDL語句不能回滾(直接提交)

https://www.2cto.com/database/201209/155881.htmlhtml

在Oracle中,Oracle執行DDL前會發出一個COMMIT語句,而後執行DDL操做,最後再發出一個COMMIT操做。 附: DDL(data definition language):create,drop,alter,rename to數據庫

對於Oracle而言,DDL其實是數據字典表的一系列的修改,也就是數據字典表的DML操做,那麼理論上講Oracle是徹底有能力實現DDL語句的回滾的,那麼Oracle爲何設計成如今的工做方式。要知道Oracle以靈活和強大的可定製性著稱,可是Oracle沒有給用戶任何回滾DDL的可能性,顯示是存在着十分充分的理由。併發

也許有人奇怪SQLSERVER或一些其餘的數據庫爲何能夠實現DDL語句的回滾。事實上,前面提到了Oracle也是有能力實現DDL回滾的,只是這會極大的影響Oracle的併發性。要知道,Oracle的鎖機制和多版本讀一致性使得Oracle的併發性在全部數據庫產品中數一數二。顯然爲了實現DDL的回滾而損失最值得稱道的併發性,Oracle認爲得不償失。設計

` SQL> show autocommit; autocommit OFF SQL> create table test (id int);htm

表已建立。rem

SQL> rollback;get

回退已完成。產品

SQL> select * from test;--表建立未回滾it

未選定行io

SQL> select sequence_name, increment_by from user_sequences;

SEQUENCE_NAME INCREMENT_BY


DBOBJECTID_SEQUENCE -50 TESTSEQ 2

SQL> alter sequence testseq increment by -2;

序列已更改。

SQL> select sequence_name, increment_by from user_sequences;

SEQUENCE_NAME INCREMENT_BY


DBOBJECTID_SEQUENCE -50 TESTSEQ -2

SQL> rollback;

回退已完成。

SQL> select sequence_name, increment_by from user_sequences; --alter sequence 也未回滾

SEQUENCE_NAME INCREMENT_BY


DBOBJECTID_SEQUENCE -50 TESTSEQ -2 `

相關文章
相關標籤/搜索