关于锁的总结杂记1

不同的SQL操作语句会自动产生不同锁模式的表级锁。每个事务都有自己(操作时)的锁模式。

而同一个事务里前后出现的不同的SQL操作语句对应的不同锁模式的表级锁相互叠加,形成了事务当前加在表上的一种锁模式的表级锁。事务再才可以用该锁模式与另一个会话的当前事务的锁模式进行比较,看是否兼容。

下面表格所展示的就是同一个事务里的先后相邻的两个操作相遇时,这两个操作对应的锁模式相遇结合所得到的新锁模式:

 

 

两种相遇的锁模式(不分先后)

相遇的结果

X     和  S

  X  (替代)

X     和  SRX

X  (替代)

X     和  RX

X  (替代)

X     和  RS

X  (替代)

SRX   和  S

SRX(替代) 

SRX   和  RX

SRX(组合) 也可说(替代)

SRX   和  RS

SRX (替代)

S     和  RS

  S  (替代)

S     和  RX

  SRX(组合)

RX    和  RS

  RX  (替代)

 

两种相遇的锁模式(不分先后)

相遇的结果

RX    和  RS

  RX   (替代)

S     和  RS

  S    (替代)

SRX   和  RS

  SRX  (替代)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 







表格所示的规律:

     X > SRX> S,即后者被前者替代;S和RX,则为SRX(两者组合的结果,这也是SRX的定义);RX>RS,,即后者被前者替代。

     也就是说锁的排斥程度越来越高了。

      不过,有一个疑问就是为什么没有XRS模式(因为X和RS相遇未得到XRS,而是为X),或者XRS等于SRX(因为两者都可以理解为表的一部分行是共享模式,另一部分是排他模式)?

      例如,在一个会话下,先lock table table_name in exclusive mode (X),后Update table_name(RX),我们用《Oracle多粒度封锁机制研究(一、研究锁机制的开始和基本篇)》里的脚本showalllock.sql查看当前事务的TM的锁模式为X。


附加:

1、在oracle中,由于行级锁只有X模式,所以理论上的IS对应在oracle中的RS锁其实还是为RX。

经试验,得知在oracle 11g R2上,

 

Select * from table_name for update

RX

lock table table_name in row share mode

RS

 


2、查看v$lock等视图


3、一个事务在未提交前,该事务上的各个DML所产生的锁都不会释放掉。事务提交后,则事务里产生的锁都会释放掉。


4、在同一个事务上的对同一个表上操作的历史上各个DML操作所产生的表级锁有组合或覆盖两种方式产生出当前对该表的表级锁的锁模式。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值