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 `