关于SELECT...FOR UPDATE到底锁表还是锁行
结论:无论是不是唯一索引,既有表锁也有行锁
不是像网上说的唯一索引锁行,非唯一索引锁表。
非唯一索引:“锁表(不能改)”的原因不是因为表锁的存在,而是行锁(record lock+gap lock)锁住了所有行,像是锁住了表。
实验
先看表结构和数据:
可以看到 docters.name是唯一索引,docters.on_call不是索引。
mysql如何查看锁状态?
可以通过show engine innodb status;
查看。
或者
mysql8.0之前使用命令select * from information_schema.innodb_locks;
mysql8.0之后使用命令select * from performance_schema.data_locks;
什么都没操作之前看一下锁状态,图片如下:
对docters.name唯一索引字段做普通查询,不加锁,图片如下:
对docters.name唯一索引字段做for update
查询,加IX
表锁和两个非间隙锁的行锁,图片如下:
对docters.on_call非索引字段做for update
查询,加IX
表锁和两个非间隙锁的行锁,以及一个gap
锁,图片如下:
注:
行级锁在使用的时候并不是直接锁掉这行记录,而是锁索引。(行锁都是加在索引上,如果通过聚集索引查询则在聚集索引上加锁,通过辅助索引查询则需要同时在辅助索引和聚集索引上加锁,不走索引则在聚集索引上加锁)
如果一条sql用到了主键索引(mysql主键自带索引),mysql会锁住主键索引;
如果一条sql操作了非主键索引,mysql会先锁住非主键索引,再锁定主键索引.
参考:Mysql报Deadlock found when trying to get lock
在批量更新时可能会出现死锁:
关于SELECT...FOR UPDATE到底锁表还是锁行相关推荐
- 面试官问:select......for update会锁表还是锁行?
欢迎关注方志朋的博客,回复"666"获面试宝典 select查询语句是不会加锁的,但是select .......for update除了有查询的作用外,还会加锁呢,而且它是悲观锁 ...
- select....for update会锁表还是锁行
select -for update 除了有查询的作用外,还会加锁呢,而且它是悲观锁.那它会加表锁还是行锁?相信很多人都知道这个结论:要看是不是用了索引/主键.没用索引/主键的话就是表锁,否则就是是行 ...
- select......for update会锁表还是锁行。
select查询语句是不会加锁的,但是select .......for update除了有查询的作用外,还会加锁呢,而且它是悲观锁. 那么它加的是行锁还是表锁,这就要看是不是用了索引/主键. 没用索 ...
- select……for update会锁表还是锁行
结果: 如果查询条件用了索引/主键,那么select - for update就会进行行锁. 如果是普通字段(没有索引/主键),那么select - for update就会进行锁表. 例如: 行锁例 ...
- select......for update会锁表还是锁行
select查询语句是不会加锁的,但是 select -for update 除了有查询的作用外,还会加锁呢,而且它是悲观锁. 那么它加的是行锁还是表锁,这就要看是不是用了索引/主键.没用索引/主键的 ...
- select......for update会锁表还是锁行?
select查询语句是不会加锁的,但是select .......for update除了有查询的作用外,还会加锁呢,而且它是悲观锁. 那么它加的是行锁还是表锁,这就要看是不是用了索引/主键. 没用索 ...
- select .... for update究竟锁表还是锁行?
文章目录 介绍 实例验证 实例前准备数据 实例1--验证通过主键索引查询会锁行 实例2--验证通过普通索引作为查询条件会锁行 实例3--验证查询条件不命中索引会锁表 实例4--验证联合索引匹配到第一个 ...
- oracle update 锁表还是锁行,for update造成的Oracle锁表与解锁
我遇到的情况: 当使用select语句查询表时,后面跟着for update , select * from table for update 当修改表中数据,但是没有commit就关掉PL/SQL, ...
- Oracle锁表 行级锁 表级锁 行级锁
2019独角兽企业重金招聘Python工程师标准>>> Oracle锁表 行级锁 表级锁 ---- 行被排他锁定 ----在某行的锁被释放之前,其他用户不能修改此行 ...
- mysql行级锁 表级锁 页级锁详细介绍_MySQL行级锁、表级锁、页级锁详细介绍
页级:引擎 BDB. 表级:引擎 MyISAM , 理解为锁住整个表,可以同时读,写不行 行级:引擎 INNODB , 单独的一行记录加锁 表级,直接锁定整张表,在你锁定期间,其它进程无法对该表进行写 ...
最新文章
- 谷歌最新视频抠图术:影子烟雾都能抠,添加水印更顺滑,UP主剪辑利器 | 开源...
- 4G EPS 中建立 UE 与 eNB 之间的 RRC 连接
- 文件,文件夹基本操作
- canvas rotate 累加旋转_【教研动态】音乐活动中,使用材料累加情境的适宜性
- mybatis三种(查询,参数传递)
- 使用r语言做garch模型_使用GARCH估计货币波动率
- CM3计算板读取SHT30以及I2C驱动
- kohana3 数据库模块配置
- art-template用户注册方法
- oracle数据库sql的执行过程,Oracle体系结构之SQL语句的执行过程
- A Simple Math Problem 矩阵打水题
- 【Git/Github学习笔记】Git常用命令(代码冲突)
- importanturlAndutl
- EPPlus.Core 1.5.4 报错 font '?' cannot be found docker core运行时2.1.0 alpine镜像 缺失微软字体...
- PHP微信公众号授权登录
- java设计求圆的面积周长的代码_java编程 1.设计一个求圆的面积和周长的类,要求:1计算当半径r=10和20时,圆的面积,并显示出来 、...
- 鲸探NFT数字臧品系统开发技术分享
- conda删除虚拟环境
- 虚拟宠物手机游戏《我的安吉拉2》上线华为AppGallery;Airbiquity宣布将扩张到非汽车市场 | 全球TMT...
- nexus+7+android+5.0++wifi+代理,二代Nexus 7获Android 5.0.2系统更新