select * from t where c=5 for update 排它锁
- RC隔离级别下,
- 对非索引字段更新,有个锁全表记录的过程,
- 不符合条件的会及时释放行锁,不必等事务结束时释放;
- 而直接用索引列更新,只会锁索引查找值和行。
- update产生的X锁在不释放的情况下,
- DELETE语句无法执行,
- 但是UPDATE语句能更新不符合之前X锁的记录。
- update产生的X锁在不释放的情况下,
- 对非索引字段更新,有个锁全表记录的过程,
- RR隔离级别下,为保证binlog记录顺序,
- 非索引更新会锁住全表记录,
- 且事务结束前不会对不符合条件记录有逐步释放的过程。
- DELETE和UPDATE语句都不能执行
版本5.7.13
rc模式下:
session 1:
begin;
select * from t where c=5 for update;
session 2:
delete from t where c=10 --等待
session 3:
insert into t values(100001,8) --成功
session 4 : update t set c=100 where id=10 -- 成功
session 1:
commit
session 2:事务执行成功
rr模式下:
begin;
select * from t where c=5 for update;
session 2:
delete from t where c=10 --等待
session 3:
insert into t values(100001,8) --等待
session 4 : update t set c=100 where id=10 --等待
session 1:
commit
session 2:事务执行成功
session 3:事务执行成功
从上面这两个简单的例子,可以大概看出上锁的流程.
不管是rr模式还是rc模式,这条语句都会先在server层对表加上MDL S锁,然后进入到引擎层。
rc模式下,由于数据量不大只有10W。通过实验可以证明session 1上来就把该表的所有行都锁住了。
导致其他事务要对该表的所有现有记录做更新,是阻塞状态。为什么insert又能成功?
说明rc模式下for update语句没有上gap锁,所以不阻塞insert对范围加插入意向锁,所以更新成功。
session 1commit后,session 2执行成功。表明所有行的x锁是在事务提交完成以后才释放。
rr模式下,session 1和session 2与rc模式下都一样,说明rr模式下也对所有行上了X锁。
唯一的区别是insert也等待了,是因为rr模式下对没有索引的更新,聚簇索引上的所有记录,都被加上了X锁。其次,聚簇索引每条记录间的间隙(GAP),也同时被加上了GAP锁。由于gap锁阻塞了insert要加的插入意向锁,导致insert也处于等待状态。只有当session 1 commit完成以后。session 1上的所有锁才会释放,S2,S3执行成功
由于例子中的数据量还比较小,如果数据量达到千万级别,就比较直观的能看出,上锁是逐行上锁的一个过程.扫描一条上一条,直到所有行扫描完,rc模式下对所有行上x锁。rr模式下不仅对所有行上X锁,还对所有区间上gap锁.直到事务提交或者回滚完成后,上的锁才会被释放。
关注公众号
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
laravel 管道及中间件源码分析
通过一个简单的实例让我们熟悉关于 laravel 管道及中间件的实现过程。 管道(包洋葱的概念)在laravel 中是将要执行的控制器的方法做为洋葱心,而多个中间件(中间件提供了一种方便的机制过滤进入应用程序的 HTTP 请求。)做为洋葱皮的概念。 核心知识点:返回闭包函数、开始包洋葱: array_reduce() 直接上代码了 <?php /** * [管道(包洋葱的概念) * 在laravel 中是将要执行的控制器的方法做为洋葱心, * 而多个中间件(中间件提供了一种方便的机制过滤进入应用程序的 HTTP 请求。)做为洋葱皮的概念] * * 核心知识点:返回闭包函数、开始包洋葱: array_reduce() * * @Author leeprince:2020-03-17 00:59 */ /** * [中间件 - Middleware01] * * @Author leeprince:2020-03-17 01:03 */ class Middleware01 { public static function handle(Closu...
-
下一篇
【Flutter 实战】17篇动画系列文章带你走进自定义动画
老孟导读:Flutter 动画系列文章分为三部分:基础原理和核心概念、系统动画组件、8篇自定义动画案例,共17篇。 动画核心概念 在开发App的过程中,自定义动画必不可少,Flutter 中想要自定义动画,首先要理解 Flutter 动画实现的基本原理及相关概念。 第1-4篇介绍了 Flutter 动画中最重要的三个概念以及三者之间的关系: AnimationController:动画控制器,控制动画的播放、停止等。继承自Animation< double >,是一个特殊的Animation对象,默认情况下它会线性的生成一个0.0到1.0的值,类型只能是 double 类型,不设置动画曲线的情况下,可以设置输出的最小值和最大值。 Curve:动画曲线,作用和Android中的Interpolator(差值器)类似,负责控制动画变化的速率,通俗地讲就是使动画的效果能够以匀速、加速、减速、抛物线等各种速率变化。 Tween:将 AnimationController 生成的 [0,1]值映射成其他属性的值,比如颜色、样式等。 第5篇讲解了动画序列 TweenSequence,其...
相关文章
文章评论
共有0条评论来说两句吧...

微信收款码
支付宝收款码