不同的SQL操作语句会自动产生不同锁模式的表级锁。每个事务都有自己(操作时)的锁模式。
而同一个事务里前后出现的不同的SQL操作语句对应的不同锁模式的表级锁相互叠加,形成了事务当前加在表上的一种锁模式的表级锁。事务再才可以用该锁模式与另一个会话的当前事务的锁模式进行比较,看是否兼容。
下面表格所展示的就是同一个事务里的先后相邻的两个操作相遇时,这两个操作对应的锁模式相遇结合所得到的新锁模式:
两种相遇的锁模式(不分先后) | 相遇的结果 |
X 和 S |
|
X 和 SRX |
|
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所产生的锁都不会释放掉。事务提交后,则事务里产生的锁都会释放掉。