1、什么是隐式锁?
隐式锁是一种乐观锁,只在必要的时候加锁。比如insert的时候,默认是不会加锁的,InnoDB的每条记录中都一个隐含的trx_id字段,这个字段存在于聚簇索引的B+Tree中。插入后会保存当前事务ID。如果后面有其他事务要对这个记录加排他锁时,将由这个事务将这个记录增加前面一个事物的显示锁。
2、insert如何加锁?
insert加隐式锁,也就是在主键索引里加上当前事务ID。如果其他事务要获取这个记录的X或者S锁,那么就会显示加X锁。
3、如何理解insert加锁和其他锁的兼容性?
也就是如果持有插入意向锁,对其他锁都不影响。
但是gap锁或者next key锁是不允许获得插入意向锁的,这也是为了防止幻读的情况产生。
4、insert intention lock有什么用?
插入意向锁,是为什么rr级别下next key锁能避免幻锁的原因。
因为如果一个范围有gap锁,是无法加上 插入意向锁的。所以不会出现插入的幻象。
5、几个例子:
如下表:
1)
在两个事物里面插两个一样的数据
insert into Music_Test values(221,21);
第二个事务执行这个语句则处于block状态。
分析:
第一个事务插入成功,对这个记录加了一个隐式锁。所以第二个事务插入的时候,发现该记录已经存在。并且是一个活事务,所以显示锁。
2)
数据库当前数据:
事务一插入:
insert into Music_Test values(221,21);
事务二执行:
select * from Music_Test where status>20 for update;或lock in share mode均处于阻塞状态。
分析:
前面不是说意向锁和gap无关么?这里我的理解是这样,并不是意向锁导致阻塞,而是记录上的隐式锁。当事务二加next key lock时,发现status=21的记录存在了,但是是存在于一个活事务中,也就是没提交。但是如果不阻塞的话,等另外一个事务提交后,事务二再查就会出现幻读现象。
参考资料: