电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

DML操作update和delete时产生的锁示例


发布日期:2019/3/19
 

测试对象在执行dml操作时都产生哪些锁elete和update时产生的锁以及并发删除一个表时锁产生的锁

测试环境Oracle

具体示例如下

会话首先需要找到此会话的sid

SQL> set time on

set prompt s

s> select sid from v$mystat where rownum<=

SID

会话 然后找到此会话的sid

SQL> set time on

set prompt s

s> select sid from v$mystat where rownum<=

SID

会话查看会话和会话的锁情况此时因为没有做任何dml操作所以没有锁

SQL> set time on

set prompt s

s> select * from v$lock where sid in(

ADDR KADDR SID TYPE ID ID LMODE REQUEST CTIME BLOCK

会话对a表删除条数据

s> delete from a where id=

row deleted

查看此时的锁情况

s> select * from v$lock where sid in(

ADDR KADDR SID TYPE ID ID LMODE REQUEST CTIME BLOCK

BF BF TM

CFC CB TX

会话对a表执行删除操作但不删除任何行

s> delete from a where id=

rows deleted

查看此时的锁情况结果发现虽然会话没有删除任何行但是仍然产生了一个TX锁和TM锁估计以后的版本中Oracle会对此进行优化在满足通用的情况下通常会有一些特例

s> select * from v$lock where sid in(

ADDR KADDR SID TYPE ID ID LMODE REQUEST CTIME BLOCK

BF BF TM

BC B TM

BDBBC BDBCE TX

CFC CB TX

会话对a表执行删除操作此时删除行数据

s> delete from a where id=

row deleted

再次查看会话此时没有新的锁增加

s> select * from v$lock where sid in(

ADDR KADDR SID TYPE ID ID LMODE REQUEST CTIME BLOCK

BF BF TM

BC B TM

BDBBC BDBCE TX

CFC CB TX

会话再次删除b表的数据

s> delete from b where rownum<=

row deleted

查看锁的情况此时发现对b表新产生一个TM锁而没有新增加TX锁

s> select * from v$lock where sid in(

ADDR KADDR SID TYPE ID ID LMODE REQUEST CTIME BLOCK

BF BF TM

BC B TM

BC BE TM

BDBBC BDBCE TX

CFC CB TX

查看的对象名称

s> select object_name from user_objects where object_id in(

OBJECT_NAME

B

A

s>

新开一个会话

SQL> set prompt s

s> set time on

s> select sid from v$mystat where rownum<=

SID

s> update a_temp set id= where rownum<

rows updated

s>

查看锁情况

s> select * from v$lock where sid in(

ADDR KADDR SID TYPE ID ID LMODE REQUEST CTIME BLOCK

BF BF TM

BC B TM

BC BE TM

BDBBC BDBCE TX

CC CA TX

CFC CB TX

rows selected

结论

DML操作一个会话只会产生一个事务锁(TX)对每个对象只产生一个表锁(TM)在不同的会话中可以对同一个对象产生多个TM锁

还有在执行dml操作中即使删除空行也会产生TX锁同时伴随TM锁但是更新空行只会产生TX锁不会产生TM锁

(注在执行dml操作时产生的锁是lmode=最高级别的事务锁TM锁是lmode=的dml级别锁)

上一篇:手把手教你创建RMANCATAGORY

下一篇:如何改变当前路径下所有目录和文件的所有权