InnoDB锁演示
| T1 | T2 |
| begin | begin |
| select * from t1 where c1=3 for update
| c1 | c2 | c3 | c4 |
+-----+-----+-----+-----+
| 3 | 3 | 3 | 0 |
|
|
| select * from t1 where c1=3 lock in share mode 这种情况会被阻塞,因为T1是排它锁,T2是共享锁,排它锁和共享锁是互斥的。 |
| T1 | T2 |
| begin | begin |
| select * from t1 where c1=3 lock in share mode
| c1 | c2 | c3 | c4 |
+-----+-----+-----+-----+
| 3 | 3 | 3 | 0 |
|
|
| select * from t1 where c1=3 for update 这种情况会被阻塞,因为T1是共享锁,T2是排它锁,排它锁和共享锁是互斥的。 |
| T1 | T2 |
| begin | begin |
| select * from t1 where c1=3 for update
| c1 | c2 | c3 | c4 |
+-----+-----+-----+-----+
| 3 | 3 | 3 | 0 |
|
|
| select * from t1 where c1=3 这种情况不会被阻塞,因为T2是一次性非锁定读。 |
| T1 | T2 |
| begin | begin |
| select * from t1 where c3=7 lock in share mode
|
|
| select * from t1 where c3=10 for update 备注:c3无索引 这种情况会被阻塞,因为T2中,C3无索引,所以会升级为表级锁。 |
| T1 | T2 |
| begin | begin |
| select * from t1 where c3=7 lock in share mode
|
|
| select * from t1 where c1=6 for update 备注:c1是主键 这种情况会被阻塞,因为T1中c3无索引,会造成表级锁。 |
| T1 | T2 |
| begin | begin |
| select * from t1 where c2=2 and c3=5 for update
|
|
| select * from t1 where c2=2 and c3=7 for update 备注:c2列上有索引,c3列上无索引,c3=7不存在 这种情况会被阻塞,因为c2=2,此列上有索引,这个记录上会加一个排它锁。T1和T2中的C3没有索引,所以不能判断是不是同一个记录,他只有将所有记录都加上锁。 |
| T1 | T2 |
| begin | begin |
| select * from t1 where c2=2 and c3=5 for update
|
|
| select * from t1 where c2=3 and c3=7 for update 备注:c2列上有索引,c3列上无索引,c3=7不存在 这种情况不会被阻塞,锁是基于索引的,T1中c2=2和 T2中c2=3并不是同一条数据。 |
| T1 | T2 |
| begin | begin |
| select * from t1 where c2=2 and c3=2 for update
|
|
| select * from t1 where c1=4 and c3=10 for update 备注:c1是主键,c2是普通索引,c3列上无索引 这种情况会被阻塞,因为在c2=2上加锁,最终会回溯到主键c1=4上也加锁。 |
| T1 | T2 |
| begin | begin |
| update t1 set c4=20 where c2>=4 | |
| select * from t1 where c2>=4 | select * from t1 where c1=7 for update 备注:c1列是主键,c2列是普通索引,T1影响了两行。 这种情况不会被阻塞,T1锁定的范围是c2>=4的所有记录,且是next lock,以及c1=8 & c1=10的record lock,T2锁定的范围是c1=7的 record lock。 |
| T1 | T2 |
| begin | begin |
| update t1 set c4=20 where c2>=4 | |
| select * from t1 where c2>=4 | insert into t1 select 7,5,10,10 备注:c1列是主键,c2列是普通索引,T1影响了两行。 这种情况会被阻塞,T1锁定的范围是c2>=4的所有记录,且是next lock,以及c1=8 & c1=10的record lock, 在T2中 5>4,所以会被阻塞。 |
| T1 | T2 |
| begin | begin |
| update t1 set c4=20 where c2>=4 | |
| select * from t1 where c2>=4 | insert into t1 select 7,2,10,10 备注:c1列是主键,c2列是普通索引,T1影响了两行。 这种情况不会被阻塞,T1锁定的范围是c2>=4的所有记录,且是next lock,以及c1=8 & c1=10的record lock, 在T2中 2<4,不管T1还是T2都不在范围内,所以不会被阻塞。 |
| T1 | T2 |
| begin | begin |
| update t1 set c4=20 where c1>=6 | |
| insert into t1 select 9,9,9,9 备注:c1列是主键,c1=6已经存在 这种情况会被阻塞,因为T1锁定的是所有c1>=6的范围record lock。 |
| T1 | T2 |
| begin | begin |
| insert into t1 select 9,9,9,9 | |
| insert into t1 select 7,7,7,7 备注:c1列是主键,c1=7和c1=9的记录都不存在 这种情况不会被阻塞,因为C1和C2都不在同一个位置上面 |
| T1 | T2 |
| begin | begin |
| insert into t1 select 9,9,9,9 | |
| insert into t1 select 9,9,9,9 备注:c1列是主键,c1=9的记录不存在 这种情况会被阻塞,因为C1和C2都在同一个位置上面 |
InnoDB锁演示的更多相关文章
- MySQL数据恢复和复制对InnoDB锁机制的影响
MySQL通过BINLOG记录执行成功的INSERT,UPDATE,DELETE等DML语句.并由此实现数据库的恢复(point-in-time)和复制(其原理与恢复类似,通过复制和执行二进制日志使一 ...
- MySQL- InnoDB锁机制
InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION):二是采用了行级锁.行级锁与表级锁本来就有许多不同之处,另外,事务的引入也带来了一些新问题.下面我们先介绍一点背景知识 ...
- MySQL InnoDB锁机制
概述: 锁机制在程序中是最常用的机制之一,当一个程序需要多线程并行访问同一资源时,为了避免一致性问题,通常采用锁机制来处理.在数据库的操作中也有相同的问题,当两个线程同时对一条数据进行操作,为了保证数 ...
- mysql InnoDB锁等待的查看及分析
说明:前面已经了解了InnoDB关于在出现锁等待的时候,会根据参数innodb_lock_wait_timeout的配置,判断是否需要进行timeout的操作,本文档介绍在出现锁等待时候的查看及分析处 ...
- 【锁】Innodb锁
InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION):二是采用了行级锁.行级锁与表级锁本来就有许多不同之处,另外,事务的引入也带来了一些新问题.下面我们先介绍一点背景知识 ...
- MySQL优化篇系列文章(二)——MyISAM表锁与InnoDB锁问题
我可以和面试官多聊几句吗?只是想... MySQL优化篇系列文章(基于MySQL8.0测试验证),上部分:优化SQL语句.数据库对象,MyISAM表锁和InnoDB锁问题. 面试官:咦,小伙子,又来啦 ...
- innodb 锁分裂继承与迁移
innodb行锁简介 行锁类型 LOCK_S:共享锁 LOCK_X: 排他锁 GAP类型 LOCK_GAP:只锁间隙 LOCK_REC_NO_GAP:只锁记录 LOCK_ORDINARY: 锁记录和记 ...
- InnoDB锁机制分析
InnoDB锁机制常常困扰大家,不同的条件下往往表现出不同的锁竞争,在实际工作中经常要分析各种锁超时.死锁的问题.本文通过不同条件下的实验,利用InnoDB系统给出的各种信息,分析了锁的工作机制.通过 ...
- [转载] 数据库分析手记 —— InnoDB锁机制分析
作者:倪煜 InnoDB锁机制常常困扰大家,不同的条件下往往表现出不同的锁竞争,在实际工作中经常要分析各种锁超时.死锁的问题.本文通过不同条件下的实验,利用InnoDB系统给出的各种信息,分析了锁的工 ...
随机推荐
- django组件之中间件
中间件的概念 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用不好会影响到 ...
- day_09 函数及参数
1.定义:把功能封装起来,方便下次直接调用 2.语法:def 关键词开头,空格之后接函数名称和圆括号(). def 函数名(形参) 函数体 3.参数:圆括号用来接收参数.若传入多个参数,参数之间用逗号 ...
- day18 约束 异常
1. 类的约束 方案一:抛出异常,子类必须重写父类方法,否则会报错 class Base: def login(self): #强制xxx做XXX事 raise NotImplementedError ...
- python3 zip()函数笔记
a=[1,2,3]b=[4,5,6] for A ,B in zip(a,b):#用zip()函数整体打包 print(A,B)
- spring AOP正则表达式的几个问题
基于包名的正则表达式,是根据抽象父类的包名过滤,还是实现类的包名过滤, 还是抽象父类实现的接口的包名过滤? org.springframework.aop.aspectj.AspectJExpress ...
- acm之奇葩数据输入专题
1.每組测试数据都在一行,不知道每组测试数据的长度,以换行为测试数据输入的结束 关键代码:if (cin.get() == '\n') {语句} 例如:找出每组测试的最大值: 输入: 3 1 4 ...
- C实现shell管理的一个例子
通常情况下,一个进程(比如cat /tmp/tt.txt)的输出与输入是标准输入(stdin或者0).标准输出(stdout或者1) shell 获取tt.txt文件中包含aa的行记录,涉及两个进程, ...
- 第八章:BOM
/* * bom: * 提供了浏览器接口; * w3c为了把javascript最基本的只是标准化已经将bom的主要方面纳入html5规范*/ console.log(window); !(funct ...
- GBDT,FM,FFM推导
GBDT推导: https://xgboost.readthedocs.io/en/latest/tutorials/model.html FM,FFM推导: https://tech.meituan ...
- thinkphp3.2.3 ueditor1.4.3 图片上传操作,在线删除上传图片功能。
最近弄一个图片 上传,可是用ueditor 自带的上传,如果不配置的话,上传的目录不在自己的项目中. 在网上找了好多,可是都是底版本的,新版本的还真是找到了一个,ueditor-thinkphp 这个 ...