间隙锁(Gap Lock)
间隙锁,锁的就是两个值之间的空隙。Mysql默认级别是repeatable-read,有办法解决幻读问题吗?间隙锁 在某些情况下可以解决幻读问题。
假设account表里数据如下:
那么间隙就有 id 为 (3,10),(10,20),(20,正无穷) 这三个区间,
在Session_1下面执行 update account set name = 'zhuge' where id > 8 and id <18;,则其他Session没 法在这个范围所包含的所有行记录(包括间隙行记录)以及行记录所在的间隙
里插入或修改任何数据,即id在 (3,20]区间都无法修改数据,注意最后那个20也是包含在内的。
在Session_1下面执行 select * from account where id =15 for update,则其他Session没法 (10,20)的间隙里插入或修改任何数据。
在Session_1下面执行 select * from account where id =22 for update,则其他Session没法 (20,z正无穷)的间隙里插入或修改任何数据。
间隙锁是在可重复读隔离级别下才会生效。
临键锁(Next-key Locks)
Next-Key Locks是行锁与间隙锁的组合。像上面那个例子里的这个(3,20]的整个区间可以叫做临键锁。只要包含了边界就是临键锁了。
要想解决幻读,锁住这个区间的某个不存在的值,那么这个区间里面就不可以做任何的修改插入操作了。