1、什么是隐式锁?

隐式锁是一种乐观锁,只在必要的时候加锁。比如insert的时候,默认是不会加锁的,InnoDB的每条记录中都一个隐含的trx_id字段,这个字段存在于聚簇索引的B+Tree中。插入后会保存当前事务ID。如果后面有其他事务要对这个记录加排他锁时,将由这个事务将这个记录增加前面一个事物的显示锁。

 

 

2、insert如何加锁?

insert加隐式锁,也就是在主键索引里加上当前事务ID。如果其他事务要获取这个记录的X或者S锁,那么就会显示加X锁。

 

 

3、如何理解insert加锁和其他锁的兼容性?

 

Mysql 隐式链接 mysql 隐式锁_加锁

也就是如果持有插入意向锁,对其他锁都不影响。

但是gap锁或者next key锁是不允许获得插入意向锁的,这也是为了防止幻读的情况产生。

 

4、insert intention lock有什么用?

插入意向锁,是为什么rr级别下next key锁能避免幻锁的原因。

因为如果一个范围有gap锁,是无法加上 插入意向锁的。所以不会出现插入的幻象。

 

5、几个例子:

如下表:

Mysql 隐式链接 mysql 隐式锁_insert锁_02

 

 

 

 

1)

在两个事物里面插两个一样的数据

insert into Music_Test values(221,21);

第二个事务执行这个语句则处于block状态。

 

分析:

第一个事务插入成功,对这个记录加了一个隐式锁。所以第二个事务插入的时候,发现该记录已经存在。并且是一个活事务,所以显示锁。

 

 

 

2)

数据库当前数据:

Mysql 隐式链接 mysql 隐式锁_意向锁_03

 

事务一插入:

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的记录存在了,但是是存在于一个活事务中,也就是没提交。但是如果不阻塞的话,等另外一个事务提交后,事务二再查就会出现幻读现象。

 

 

参考资料: