证明truncate发出了可观察的commit命令

原创 2004年07月09日 21:11:00

一般来说,我们通常认为,truncate 的伪代码是:

commit; ---------- 1
truncate;
commit; ------------ 2

那我们有个疑问,commit 1和 truncate 是不可分割的吗?具有原子性吗?那我们来看看下面的演示

session 1:
SQL> create table t as select * from all_objects where rownum < 11;

Table created.

SQL> delete from t where rownum = 1;

1 row deleted.

SQL>



session 2:

SQL> lock table t in exclusive mode;



很明显,session 2 在这里被hang住了


session 1:

SQL> create table t as select * from all_objects where rownum < 11;

Table created.

SQL> delete from t where rownum = 1;

1 row deleted.

SQL> commit;

Commit complete.

SQL>


再看 session 2

SQL> lock table t in exclusive mode;

Table(s) Locked.

SQL>


加锁成功

这时我们再在 session 1上执行delete操作

session 1:

SQL> create table t as select * from all_objects where rownum < 11;

Table created.

SQL> delete from t where rownum = 1;

1 row deleted.

SQL> commit;

Commit complete.

SQL> delete from t where rownum = 1;


这时被阻塞了


接下来我们去 session 2中去尝试truncate

session 2:

SQL> lock table t in exclusive mode;

Table(s) Locked.

SQL> truncate table t;
truncate table t
*
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified


SQL>

发现truncate 失败,切到 session 1 看看
SQL> create table t as select * from all_objects where rownum < 11;

Table created.

SQL> delete from t where rownum = 1;

1 row deleted.

SQL> commit;

Commit complete.

SQL> delete from t where rownum = 1;

1 row deleted.

SQL>


    发现 session 1的删除居然成功了,而session 2的truncate 却失败了。这说明,当 session 2 truncate发出commit 1 之后,还没有执行truncate,在这之前session 1的delete操作由于是被 lock table 阻塞但是时间却在 truncate 之前,所以在这个间歇中 session 抢在了前面,从而导致 truncate 失败。

    其实之所以要做这个测试,也不纯粹是无聊,是因为我们有一个程序,需要首先truncate一个表,然后另一个进程去做一些数据的操作,如果truncate失败则后续的操作就有问题,但是truncate失败却不能阻止后面的进程的操作。当时我在想能否在truncate之前使用lock  table 去加锁,直到其他进程dml完毕这个进程获得了独占表锁然后truncate,看看这样是否可行。结果很遗憾,我的测试结果发现这个想法是不大现实的。 

 


sql使用truncate和delete清空table的区别(总结)

1.truncate在各种表上无论是大的还是小的都非常快。如果有rollback命令,delete 将会被撤销,而truncate不会被撤销。...
  • gumengkai
  • gumengkai
  • 2016年04月07日 00:08
  • 2998

[PL/SQL] 请教大家一个问题,存储过程中需要几个commit?

查看: 10357|回复: 17 收藏    [PL/SQL] 请教大家一个问题,存储过程中需要几个commit? [复制链接]     ...
  • asdsa108
  • asdsa108
  • 2015年12月24日 10:56
  • 1201

【Git学习笔记】只有add之后的修改才能被commit

标题可能让人感觉不太明白。我想说的是,凡是被commit到版本库的内容,都是有些...
  • liuchunming033
  • liuchunming033
  • 2014年11月03日 15:16
  • 2282

一条TRUNCATE命令所带来的严重后果

上午有同事让我帮他删除数据,因为他用DELETE删除时很慢,就把删除语句发给我了:DELETE FROM cjcl.cj_cj_tbjd where bgq = ‘201309MM’我一看,这条语句所...
  • jiaping0424
  • jiaping0424
  • 2017年11月30日 10:29
  • 67

比较truncate和delete 命令

比较truncate和delete 命令 1、在功能上,truncate是清空一个表的内容,它相当于delete from table_name。 2、 delete是dml操作,truncate...
  • quanhj
  • quanhj
  • 2012年02月24日 12:04
  • 1523

oracle之delete和truncate命令用法和区别

delete删除表的数据,可以指定条件删除,如果事务未提交,则可以回滚; truncate删除表的全部数据,只保留表结构,事务自动提交,数据不可以回滚。 实例: 1. 新建一个表 create...
  • yhl_jxy
  • yhl_jxy
  • 2017年02月08日 17:11
  • 696

【Git】常用命令commit提交,push推送,merge,添加分支branch

1.查看所有分支 用命令:git branch -a $ git branch -a * gym master remotes/origin/HEAD -> origin/master r...
  • catshitone
  • catshitone
  • 2017年02月10日 21:18
  • 2935

git学习——个人常用命令add,commit以及push

Git命令行配置 1 安装Github 2 安装msysgit 3 要配置用户名和油箱   git config --global user.name  我的命令就是:git config --gl...
  • sheldon761642718
  • sheldon761642718
  • 2016年10月14日 11:20
  • 11982

Git学习 --> 个人常用命令add,commit以及push

原文: http://blog.csdn.net/mchdba/article/details/12083965 Git命令行配置 1 安装Github 2 安装msysgit 3 ...
  • CloudCoding
  • CloudCoding
  • 2015年10月23日 19:24
  • 319

GIT 命令学习:基础快照-add,status,commit,reset,rm,mv,diff

GIT 命令学习:add、status、commit、reset、rm、mv、diff。
  • xholes
  • xholes
  • 2017年04月07日 21:06
  • 288
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:证明truncate发出了可观察的commit命令
举报原因:
原因补充:

(最多只允许输入30个字)