当前位置:Gxlcms > 数据库问题 > mysql系列--锁和MVCC

mysql系列--锁和MVCC

时间:2021-07-01 10:21:17 帮助过:32人阅读


事物A创建后事物B创建,此时都未提交,数据相互不可见,此时k值为1,若同时更改了k值自增,按照之前逻辑更改后都为2,结果不对,更新为先查询后更新,此查询的值为当前读,即实际最新的数据
除了 update 语句外,select 语句如果加锁,也是当前读。
mysql> select k from t where id=1 lock in share mode;
mysql> select k from t where id=1 for update;

 技术图片

假设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   

人气教程排行