数据库篇——锁

目录

引文A——活锁

引文B——死锁

1、表锁

1.1 关于表级 S 锁

1.2 关于表级 X 锁

1.3 关于意向锁

2、行锁

2.1 关于记录锁

2.2 关于间隙锁

2.3 关于临键锁

2.4 关于插入意向锁

3、页锁


前文引入:

我们在谈表锁、行锁以及页锁之前,先聊一聊 活锁🔒与 死锁🔒的问题  ( •̀ ω •́ )✧

引文A——活锁

举个栗子🤔:

  1. 现在有事务 A 获取到了该数据 data 的锁,这时,事务 B 又请求获取 data 锁,于是事务 B 进行等待...
  2. 此时,事务 C 也来获取 data 锁,事务 A 释放了 data 锁后首先批准了 事务 C 的请求,事务 B 仍然等待...以此类推.......
  3. 现在就有一个很严重的问题,事务 B 可能永远等待。这,就是经典的活锁问题

解决方法:

采用先来先服务的策略,当多个事务请求同一数据时,会按照请求获取锁的先后顺序进行事务排队,前一个事务一旦释放锁,就批准队列中第一个事务前来获取锁

  

引文B——死锁

举个栗子🤔:

  1. 现在有 事务A 获取到了数据 data1 的锁,而 事务B 获取到了数据 data2 的锁
  2. 这时,事务A 又来获取数据 data2 的锁,由于该数据已被事务B上锁,所以事务A进行等待事务B释放锁
  3. 好巧不巧,事务B 来获取数据 data1 的锁,而该数据是被 事务A 上锁的,所以事务B进行等待事务A释放锁
  4. 这样,就出现了 事务A 等待 事务B,而 事务B 又等待 事务A 的局面。这,就是经典的死锁问题

解决方法:

  • 使用 一次封锁法 或者使用 顺序封锁法 来进行死锁的预防
  • 使用 超时法 或者 事务等待图法 来进行死锁的诊断问题
  • 选择一个处理死锁代价最小的事务,将其撤销,释放此事务持有的所有锁,使其他事务得以继续运行下去来进行死锁的解除;当然,对撤销的事务所执行的数据修改操作必须加以恢复


1、表锁

一般情况下,不会使用 InnoDB 存储引擎提供的表级别的 S锁 和 X锁 。只会在一些特殊情况下,比方说 崩溃恢复 过程中用到。

需要注意的是:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迷迷的k

感谢长的这么帅还来打赏我

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值