什么是间隙锁?
间隙锁,锁的就是两个值之间的空隙,间隙锁是在可重复读隔离级别下才会生效。
比如下列数据库表中:
id为4到8中就有间隙,id为11到40中也有间隙,间隙锁就是在这两个间隙中加锁,其他事务无法插入值。
mysql为什么要设计这个锁呢?
还记得mysql默认的事务隔离级别是什么吗?
答案是 可重复读(Repeatableread),那么这个隔离级别有什么数据安全问题呢?看下面表格
隔离级别 | 脏读(Dirty Read) | 不可重复读(NonRepeatable Read) | 幻读(Phantom Read) |
读未提交(Read uncommitted) | 可能 | 可能 | 可能 |
读已提交(Read committed) | 不可能 | 可能 | 可能 |
可重复读(Repeatableread) | 不可能 | 不可能 | 可能 |
可串行化 (Serializable) | 不可能 | 不可能 | 不可能 |
对!会出现幻读,那么什么是幻读?
幻读(Phantom Reads)就是事务A读取到了事务B提交的新增数据
那么有了间隙锁就解决了这个问题!因为当A事务操作的当前操作的间隙加锁了,B事务就无法对这个间隙新增数据了,A事务也就不会读取到B新增的数据了
问题复现
幻读不好复现,按理论上来说间隙锁是可以避免幻读的