测试对象在执行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级别锁) |