您的位置:首页 > 数据库 > MySQL

MySQL InnoDB存储引擎中的锁(二)

2017-09-17 18:04 218 查看

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(等待图):保存锁的信息链表, 事务的等待链表,通过两个链表构建一张图,若图存在环,则说明存在死锁。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: