知识大全 DML操作update和delete时产生的锁示例
Posted 操作
篇首语:谷要自长,人要自强。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 DML操作update和delete时产生的锁示例相关的知识,希望对你有一定的参考价值。
DML操作update和delete时产生的锁示例 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
测试对象 在执行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
B F B F TM
C F C C B 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
B F B F TM
B C B TM
BDBBC BDBCE TX
C F C C B 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
B F B F TM
B C B TM
BDBBC BDBCE TX
C F C C B 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
B F B F TM
B C B TM
B C B E TM
BDBBC BDBCE TX
C F C C B 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
B F B F TM
B C B TM
B C B E TM
BDBBC BDBCE TX
C C C A TX
C F C C B TX
rows selected
结论
DML操作一个会话只会产生一个事务锁(TX) 对每个对象只产生一个表锁(TM) 在不同的会话中可以对同一个对象产生多个TM锁
还有在执行dml操作中即使删除空行也会产生TX锁 同时伴随TM锁 但是更新空行只会产生TX锁 不会产生TM锁
cha138/Article/program/Oracle/201311/16559相关参考