网站建设丨金手指15,phpcms建设网站,在线图片处理工具,万网一台虚拟主机做多个网站Record Lock记录锁
Record Lock 称为记录锁#xff0c;锁住的是一条记录。而且记录锁是有 S 锁和 X 锁之分的#xff1a;
当一个事务对一条记录加了 S 型记录锁后#xff0c;其他事务也可以继续对该记录加 S 型记录锁#xff08;S 型与 S 锁兼容#xff09;#xff0c;…Record Lock记录锁
Record Lock 称为记录锁锁住的是一条记录。而且记录锁是有 S 锁和 X 锁之分的
当一个事务对一条记录加了 S 型记录锁后其他事务也可以继续对该记录加 S 型记录锁S 型与 S 锁兼容但是不可以对该记录加 X 型记录锁S 型与 X 锁不兼容;当一个事务对一条记录加了 X 型记录锁后其他事务既不可以对该记录加 S 型记录锁S 型与 X 锁不兼容也不可以对该记录加 X 型记录锁X 型与 X 锁不兼容。 当一个事务执行了当前读
select * from t_test where id 1 for update;
就是对 t_test 表中主键 id 为 1 的这条记录加上 X 型的记录锁这样其他事务就无法对这条记录进行修改了。 当事务执行 commit 后事务过程中生成的锁都会被释放。
Gap Lock 间隙锁
Gap Lock 称为间隙锁只存在于可重复读隔离级别目的是为了解决可重复读隔离级别下幻读的现象。
假设表中有一个范围 id 为35间隙锁那么其他事务就无法插入 id 4 这条记录了这样就有效的防止幻读现象的发生。 间隙锁虽然存在 X 型间隙锁和 S 型间隙锁但是并没有什么区别间隙锁之间是兼容的即两个事务可以同时持有包含共同间隙范围的间隙锁并不存在互斥关系因为间隙锁的目的是防止插入幻影记录而提出的。
Next-Key Lock 临键锁
Next-Key Lock 称为临键锁是 Record Lock Gap Lock 的组合锁定一个范围并且锁定记录本身。
假设表中有一个范围 id 为35] 的 next-key lock那么其他事务即不能插入 id 4 记录也不能修改 id 5 这条记录。 所以next-key lock 即能保护该记录又能阻止其他事务将新纪录插入到被保护记录前面的间隙中。
next-key lock 是包含间隙锁记录锁的如果一个事务获取了 X 型的 next-key lock那么另外一个事务在获取相同范围的 X 型的 next-key lock 时是会被阻塞的。
比如一个事务持有了范围为 (1, 10] 的 X 型的 next-key lock那么另外一个事务在获取相同范围的 X 型的 next-key lock 时就会被阻塞。
虽然相同范围的间隙锁是多个事务相互兼容的但对于记录锁我们是要考虑 X 型与 S 型关系X 型的记录锁与 X 型的记录锁是冲突的
插入意向锁特殊的间隙锁
一个事务在插入一条记录的时候需要判断插入位置是否已被其他事务加了间隙锁next-key lock 也包含间隙锁。
如果有的话插入操作就会发生阻塞直到拥有间隙锁的那个事务提交为止释放间隙锁的时刻在此期间会生成一个插入意向锁表明有事务想在某个区间插入新记录但是现在处于等待状态。
举个例子假设事务 A 已经对表加了一个范围 id 为35间隙锁。 当事务 A 还没提交的时候事务 B 向该表插入一条 id 4 的新记录这时会判断到插入的位置已经被事务 A 加了间隙锁于是事物 B 会生成一个插入意向锁然后将锁的状态设置为等待状态PSMySQL 加锁时是先生成锁结构然后设置锁的状态如果锁状态是等待状态并不是意味着事务成功获取到了锁只有当锁状态为正常状态时才代表事务成功获取到了锁此时事务 B 就会发生阻塞直到事务 A 提交了事务。
插入意向锁名字虽然有意向锁但是它并不是意向锁它是一种特殊的间隙锁属于行级别锁。
尽管「插入意向锁」也属于间隙锁但两个事务却不能在同一时间内一个拥有间隙锁另一个拥有该间隙区间内的插入意向锁当然插入意向锁如果不在间隙锁区间内则是可以的。