目录
前文引入:
我们在谈表锁、行锁以及页锁之前,先聊一聊 活锁🔒与 死锁🔒的问题 ( •̀ ω •́ )✧
引文A——活锁
举个栗子🤔:
- 现在有事务 A 获取到了该数据 data 的锁,这时,事务 B 又请求获取 data 锁,于是事务 B 进行等待...
- 此时,事务 C 也来获取 data 锁,事务 A 释放了 data 锁后首先批准了 事务 C 的请求,事务 B 仍然等待...以此类推.......
- 现在就有一个很严重的问题,事务 B 可能永远等待。这,就是经典的活锁问题
解决方法:
采用先来先服务的策略,当多个事务请求同一数据时,会按照请求获取锁的先后顺序进行事务排队,前一个事务一旦释放锁,就批准队列中第一个事务前来获取锁
引文B——死锁
举个栗子🤔:
- 现在有 事务A 获取到了数据 data1 的锁,而 事务B 获取到了数据 data2 的锁
- 这时,事务A 又来获取数据 data2 的锁,由于该数据已被事务B上锁,所以事务A进行等待事务B释放锁
- 好巧不巧,事务B 来获取数据 data1 的锁,而该数据是被 事务A 上锁的,所以事务B进行等待事务A释放锁
- 这样,就出现了 事务A 等待 事务B,而 事务B 又等待 事务A 的局面。这,就是经典的死锁问题
解决方法:
- 使用 一次封锁法 或者使用 顺序封锁法 来进行死锁的预防
- 使用 超时法 或者 事务等待图法 来进行死锁的诊断问题
- 选择一个处理死锁代价最小的事务,将其撤销,释放此事务持有的所有锁,使其他事务得以继续运行下去来进行死锁的解除;当然,对撤销的事务所执行的数据修改操作必须加以恢复
1、表锁
一般情况下,不会使用 InnoDB 存储引擎提供的表级别的 S锁 和 X锁 。只会在一些特殊情况下,比方说 崩溃恢复 过程中用到。
需要注意的是: