知识大全 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

相关参考