MySQL 的锁机制
MySQL 的锁机制
锁分类
从性能上分为乐观锁(用版本对比来实现)和悲观锁对数据库操作类型分为读锁和写锁(都属于悲观锁)
读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会相互影响写锁(排他锁):当前写操作没有完成之前,它会阻断其他写锁和读锁从对数据操作的粒度分为表锁和行锁
表锁
每次操作锁住整张表。开销小,加锁快;不会出现死锁;锁定粒度大,发生冲突的概率最高,并发度最低
间隙锁
但我们使用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但不存在的记录,叫做“间隙(GAP)”,InnoDB也会对这个“间隙”加锁,这种锁机制就是所谓的间隙锁。
很显然,在使用范围条件检索并锁定记录时,InnoDB这种加锁机制会阻塞符合条件范围内键值的并发插入,这往往会造成严重的锁等待。因此,在实际应用开发中,尤其是并发插入比较多的应用,我们要尽量优化业务逻辑,尽量使用等值条件来访问更新数据,避免使用范围条件,或者尽可能缩小范围(缩小间隙锁的范围)
使用间隙锁的目的
- 防止幻读,以满足相关隔离级别的要求
- 满足恢复和复制的需要
在一个事务未提交前,其他并发事务不能插入满足其锁定条件的任何记录,也就是不允许出现幻读。
本文由作者按照 CC BY 4.0 进行授权