锁类型
- 行级锁
- 共享锁(s lock)
- 排他锁(x lock)
- 表级锁
为了在一个事务中揭示下一行将被请求的锁类型。因为innodb支持的是行级锁,所以他不会阻塞除全表以外的任何请求
- 意向共享锁(is lock)
- 意向排他锁(ix lock)
- 加锁过程
在加行级锁之前,会先加一个同类型的意向锁,再加行级锁
另一个事务在加锁之前会先判断该表的意向锁和即将要加的行级是否兼容
优点:避免无意义的判断(例如,如果表先加了xlock,另一个事务想要查询,这时候如果没有意向锁,那么需要将查询的每一列判断是否加
x lock了)
一致性非锁定读
-
mvcc(多版本控制读)
可以不需要等待x lock的释放,直接通过读快照拿到结果,有undo段数据实现,这个快照其实就是该行的历史数据,该行的历史数据是有多个版本的,所以叫mvcc,在不同的事务隔离级别下拿到的快照是不同的
0.读未提交a事务总能读取到最新的快照版本
1.读已提交
一旦b事务提交了,a事务就能拿到最新的快照版本
2.可重复读,快照一直都会是a事务开始时获取的版本
3串行化并发行最低,读取的是最新数据不是快照,但是要求同事只有一个事务
一致性锁定读
innodb 有两种显式加锁
- select * for update (排他锁)
- select * lock in share mode (共享锁)
锁算法
-
record lock(锁单条记录)
-
gap lock(间隙锁,锁范围)
-
next-key lock(即锁范围,也锁单条记录)(为了解决phantom problem)
- 如果查询的索引含有唯一索引时,next-key lock会降级为record lock
- 如果是辅助索引,那么除了锁当前区间外,还会加gap lock,锁下一段区间
-
解决phantom problem的方法
- 在可重复读的事务隔离级别下,用next-key lock
- 将事务隔离级别设置为读已提交