当并发事务同时访问资源时,需要用一种机制来将访问顺序化,以保证数据一致性,锁就是这种机制
锁的粒度
- 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低
- 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高
- 页级锁:锁定一页。
行锁
- 共享锁(S锁):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。
- 也叫做读锁:读锁是共享的,多个客户可以同时读取同一个资源,但不允许其他客户修改。
- 排他锁(X锁):允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁。
- 也叫做写锁:写锁是排他的,写锁会阻塞其他的写锁和读锁。
乐观锁、悲观锁
悲观锁就是通常说的数据库锁机制;
乐观锁是一种思想,具体实现是,表中有一个version字段,第一次读的时候,获取到这个字段。处理完业务逻辑开始更新的时候,需要再次查看该字段的值是否和第一次的一样。如果一样更新,反之拒绝。
update A set Name=lisi,version=version+1 where ID=#{id} and version=#{version}
之所以叫乐观,因为这个模式没有从数据库加锁,等到更新的时候再判断是否可以更新。
间隙锁
当我们用范围条件检索数据并请求共享或排他锁时,InnoDB会给符合范围条件的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录,叫做“间隙(GAP)”。InnoDB也会对这个“间隙”加锁,这种锁机制就是所谓的间隙锁。
MySQL的恢复机制要求:在一个事务未提交前,其他并发事务不能插入满足其锁定条件的任何记录。
all id {0-60}, where id>50, then date id>60 be called Gap, and will add Gap Lock.