时间:2021-07-01 10:21:17 帮助过:32人阅读
假设k=1,事务 C’更新后并没有马上提交,在它提交前,事务 B 的更新语句先发起了。前面说过了,虽然事务 C’还没提交,但是k已经增加为了2并生成了版本,并且是当前的最新版本。那么,事务 B 的更新语句会怎么处理呢?这时候,我们在上一篇文章中提到的“两阶段锁协议”就要上场了。事务 C’没提交,也就是k=2这个版本上的写锁还没释放。而事务 B 是当前读,必须要读最新版本,而且必须加锁,因此就被锁住了,必须等到事务 C’释放这个锁,才能继续它的当前读。
可重复读的核心就是一致性读(consistent read)
Online DDL的过程是这样的:
1. 拿MDL写锁
2. 降级成MDL读锁
3. 真正做DDL
4. 升级成MDL写锁
5. 释放MDL锁
1、2、4、5如果没有锁冲突,执行时间非常短。第3步占用了DDL绝大部分时间,这期间这个表可以正常读写数据,是因此称为“online ”
其他步骤有冲突依然会阻塞
MDL作用是防止DDL和DML并发的冲突。
死锁检测说明:
1. 一致性读不会加锁,就不需要做死锁检测;
2. 并不是每次死锁检测都都要扫所有事务。比如某个时刻,事务等待状态是这样的:
B在等A,
D在等C,
现在来了一个E,发现E需要等D,那么E就判断跟D、C是否会形成死锁,这个检测不用管B和A
死锁检测发现后,reset_connection只是复位状态,恢复到连接和权限验证之后的状态,没有重连
怎么删除表的前 10000 行?
方式一、直接执行 delete from T limit 10000)里面,单个语句占用时间长,锁的时间也比较长;而且大事务还会导致主从延迟。
方式二(推荐),在一个连接中循环执行 20 次 delete from T limit 500
方式三,(即:在 20 个连接中同时执行 delete from T limit 500),会人为造成锁冲突。
1、积少成多,下载高佣联盟,领取各大平台隐藏优惠券,每次购物省个十块八块不香吗,通过下方二维码注册的用户可添加微信liershuang123(微信号)领取价值千元海量学习视频。
为表诚意奉献部分资料:
软件电子书:链接:https://pan.baidu.com/s/1_cUtPtZZbtYTF7C_jwtxwQ 提取码:8ayn
架构师二期:链接:https://pan.baidu.com/s/1yMhDFVeGpTO8KTuRRL4ZsA 提取码:ui5v
架构师阶段课程:链接:https://pan.baidu.com/s/16xf1qVhoxQJVT_jL73gc3A 提取码:2k6j
2、本人重金购买付费前后端分离脚手架源码一套,现10元出售,加微信liershuang123获取源码
mysql系列--锁和MVCC
标签:ODB 导致 策略 可见性 star sch 直接 黄色 flush