说到ddl的commit,就要说到隐式提交,隐式提交可能发生在
1. 正常退出sqlplus
2.ddl
3.dcl
一个ddl语句,比如说truncate操作,那么这个操作到底具体是如何执行的,一个ddl操作大致可以分解成
1.commit
2.truncate
3.commit
这3个操作不是原子操作,很容易证明这个问题
session 1:
SQL> create table test(id int) ;
表已创建。
SQL> insert into test select rownum from dual connect by rownum<10;
已创建9行。
SQL> commit;
提交完成。
SQL> delete from test where rownum<4;
已删除3行。
session 2:
SQL> delete from test where rownum<8;
已删除6行。
session 1:
SQL> truncate table test;
truncate table test
*
第 1 行出现错误:
ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源
session 3:
SQL> select * from test;
ID
----------
4
5
6
7
8
9
从session 3:的结果证明,session1的commit已经完成
整个语句的流程 :
truncate table test 之后
先是commit, 这时候session1的事务已经提交,由于session2 先发出的delete 语句,所以session2先执行,这时候又轮到session 1 ,因为session2 的事务没结束,所以session 1报错资源忙
转到正题,ddl的commit到底是何时执行的呢
session 1:
SQL> insert into test values(2);
已创建 1 行。
SQL> create table ;
create table
*
第 1 行出现错误:
ORA-00903: 表名无效
SQL> create table k;
create table k
*
第 1 行出现错误:
ORA-00906: 缺失左括号
SQL> create table k();
create table k()
*
第 1 行出现错误:
ORA-00904: : 标识符无效
SQL> create table tk(t chra(10));
create table tk(t chra(10))
*
第 1 行出现错误:
ORA-00907: 缺失右括号
SQL> create table tk(t nmuber); //我发现只有在这一步的时候才会被提交
create table tk(t nmuber)
*
第 1 行出现错误:
ORA-00902: 无效数据类型
SQL> select * from test;
ID
----------
1
2
session 2:
SQL> select * from test;
ID
----------
1
2
我把提交之前的所有错误归结为语法错误,而提交的那个错误则是语义错误
我对整个ddl操作过程的总结,先是进行语法分析,commit ,语义分析,ddl语句,commit
我2年前测试的