不同情况下同个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锁。