您的当前位置:首页正文

oracle ddl会被什么阻塞,drop这样的ddl语句一定会隐式提交吗?

2025-01-16 来源:个人技术集锦

说到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年前测试的

Top