image.png
间隙锁(Gap Lock)
条件:RR事务隔离级别下
锁加在不存在的空闲空间,可以是两个索引记录之间,也可能是第一个索引记录之前或最后一个索引之后的空间。
间隙锁是封锁索引记录中的间隔,或者第一条索引记录之前的范围,又或者最后一条索引记录之后的范围。
下图就是六条记录,并且形成了7个间隙。 那么对间隙上锁,就是间隙锁。
image.png
间隙锁可能出现的问题演示
演示1:
image.png
image.png
如上图,如果事务1 步骤5 插入的是 id= 98 ,事务2 步骤6 插入的是 id=99 数据,那么 不会出现 阻塞 死锁问题。
演示2:
image.png
表锁
对整个表进行上锁的操作,叫表锁
对表进行加锁
LOCK TABLES table_name WRITE/READ;
解锁 (释放当前会话所加的表锁)
UNLOCK TABLES;
如上方式对表进行加锁,是一种绝对加锁的方式。
如果 对表 加了写锁 以后,其它 会话,无法读表中任何数据(普通select也不行),无法做任何修改,只能阻塞,直到 表锁 释放;
如果 对表 加了读锁 以后,其它会话可以 继续读取数据,或者继续对表加读锁(共享锁),但是在加了读锁之后,其它会话就不能去修改表中任何数据,直到锁释放;
如下 操作,也会 对 表整个范围进行加锁(不同种类锁,范围覆盖整个表,也叫表锁)。
在RR的隔离级别下,当color字段 为 非索引字段时:
update table_name set field1=param1 where color=’red’;
全表扫描,最终导致 上锁的范围为整个表,其中有 X锁 有 Gap锁。
image.png
从锁定范围来讲,这里也叫表锁;
插入意向锁(InnoDB)
多个事务,在同一个索引,同一个范围区间插入记录时,如果插入的位置不冲突,不会阻塞彼此。
在插入数据时,会产生插入意向锁,会对意向id位置进行上锁(非Gap锁),属于排他锁;
事务1 插入id为1的数据,挂起事务不提交,事务2 也插入id为1的数据,则需要阻塞,直到事务1释放 意向锁。事务2 两种结果:1、主键冲突,2、执行成功;
如果事务1 插入id为1数据,事务2插入id为2数据,则互不影响。
如上内容,如有 疑问,欢迎沟通指正。
文章均来自互联网如有不妥请联系作者删除QQ:314111741 地址:http://www.mqs.net/post/15463.html
添加新评论