oracle+ddl+执行很慢,Oracle的DDL语句不能回滚(直接提交)
在Oracle中,Oracle執(zhí)行DDL前會發(fā)出一個COMMIT語句,然后執(zhí)行DDL操作,最后再發(fā)出一個COMMIT操作。 附: DDL(data definition language):create,drop,alter,rename to
對于Oracle而言,DDL實際上是數(shù)據(jù)字典表的一系列的修改,也就是數(shù)據(jù)字典表的DML操作,那么理論上講Oracle是完全有能力實現(xiàn)DDL語句的回滾的,那么Oracle為什么設(shè)計成現(xiàn)在的工作方式。要知道Oracle以靈活和強大的可定制性著稱,但是Oracle沒有給用戶任何回滾DDL的可能性,顯示是存在著十分充分的理由。
也許有人奇怪SQLSERVER或一些其他的數(shù)據(jù)庫為什么可以實現(xiàn)DDL語句的回滾。事實上,前面提到了Oracle也是有能力實現(xiàn)DDL回滾的,只是這會極大的影響Oracle的并發(fā)性。要知道,Oracle的鎖機制和多版本讀一致性使得Oracle的并發(fā)性在所有數(shù)據(jù)庫產(chǎn)品中首屈一指。顯然為了實現(xiàn)DDL的回滾而損失最值得稱道的并發(fā)性,Oracle認為得不償失。
` SQL> show autocommit; autocommit OFF SQL> create table test (id int);
表已創(chuàng)建。
SQL> rollback;
回退已完成。
SQL> select * from test;--表創(chuàng)建未回滾
未選定行
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 `
總結(jié)
以上是生活随笔為你收集整理的oracle+ddl+执行很慢,Oracle的DDL语句不能回滚(直接提交)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php编译自己库文件,php编译后追加库
- 下一篇: 【机器学习】半监督学习