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 `