1. 锁的算法
InnoDB存储引擎中有三种行锁算法:
- Record Lock:单个行记录上的锁
- Gap Lock: 间隙锁,锁定一个范围,但不包含记录本身
- Next-key Lock: Gap Lock + Record Lock, 锁定一个范围, 并且锁定记录本身
1.1 Next-Key Lock
Next_Key Lock 是结合了Gap Lock 和 Record Lock的一种锁定算法,例如有一个索引有10, 11, 13, 20 四个值, 则Next-Key Lock的锁定区间为(-∞, 10), [10, 11), [11, 13), [13, 20), [20, +∞)。
当查询的索引含有唯一属性时, Next-Key Lock会降级为Record Lock,仅锁住索引本身,而不是范围。
对于辅助索引, 则会使Next-Key Lock,并且InnoDB引擎还会对辅助索引的下一个键值加上Gap Lock。
InnoDB使用Next-Key Locking机制来避免幻读问题。
幻读是指在同一事务下, 连续执行两次同样的SQL语句可能导致不同结果, 第二次的SQL语句可能会返回之前不存在的行。
2. 死锁
2.1 概念
死锁是指两个或者两个以上的事务在执行过程中,因争夺锁资源造成的一种互相等待的现象。
解决死锁的方式:
- 超时回滚:当一个事务等待时间超过设定的时间时进行回滚, 另一个事务就可以继续进行, InnoDB中通过参数innodb_lock_wait_timeout来设置超时时间。
- wait-for graph(等待图):保存锁的信息链表, 事务的等待链表,通过两个链表构建一张图,若图存在环,则说明存在死锁。