不同情况下同个SQL语句产生不同锁模式的锁的规则

不同情况下同个SQL语句产生不同锁模式的锁的规则,至于为什么会产生非默认的锁模式还不知道原因。规则叙述如下:

事务中的一个DML操作,在它要真正实际对数据行执行操作前,先要在该数据行所属的表上加上表级锁再在该数据行上加行级锁,总之要先加锁后才能实际操作。

于是,在加锁的过程中,该DML操作先看该数据行是否存在。

若是该数据行不存在的,继续看该数据行所属的表是否有约束,例如是否有外键约束,如外键且没有索引时,则看该DML操作语句,和另一个会话中已有过的DML操作语句是否一样,一样的话,则加在表上的TM锁的锁模式与另一个会话的(或是说按该DML操作默认产生的默认锁模式的TM)不一样;如果该数据行所属的表有外键约束,且外键有索引时,则加在表上的TM锁的锁模式就是按该DML操作默认产生的默认锁模式的TX(TM?)。

若是该数据行存在的话,还要看该数据行是否被行级锁锁定。如果该数据行没有被行级锁锁定了,那么先在表上的TM锁,而且加在表上的TM锁锁模式是按该DML操作默认产生的默认锁模式的TM,之后并查看该数据行的字段是否有参照完整性约束。有的话,先加该表的TM锁,再看该数据行有否行级锁,有,则加非默认模式的TX锁,无行级锁,则为默认模式的TX。如果该数据行被行级锁锁定了,那么看是否有约束,例如实体完整性约束,有的话,加的TX锁为非默认模式的。

注释:

1、除了数据行不存在,且DML操作语句与另一个会话已过的DML语句一样时,该DML会产生非默认模式的TM锁加到表上外,其他情况都是默认锁模式的TM锁。

2、任何DML操作都会产生TM锁加到表上,但是不一定会产生TX锁。例如,事务开始第一个DML操作操作的数据行是不存在的时候,就不会产生TX锁。

3、TX锁随着事务结束而结束,不是随着rollback to a而结束的。

4、不同SQL操作在不同完整性约束或是有无索引之类的情况下,对应产生不同锁模式的TM锁。



详见《Oracle多粒度封锁机制研究(一、研究锁机制的开始和基本篇) 》的Oracle 多粒度封锁机制示例







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值