结论:无论是不是唯一索引,既有表锁也有行锁
不是像网上说的唯一索引锁行,非唯一索引锁表。
非唯一索引:“锁表(不能改)”的原因不是因为表锁的存在,而是行锁(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到底锁表还是锁行相关推荐

  1. 面试官问:select......for update会锁表还是锁行?

    欢迎关注方志朋的博客,回复"666"获面试宝典 select查询语句是不会加锁的,但是select .......for update除了有查询的作用外,还会加锁呢,而且它是悲观锁 ...

  2. select....for update会锁表还是锁行

    select -for update 除了有查询的作用外,还会加锁呢,而且它是悲观锁.那它会加表锁还是行锁?相信很多人都知道这个结论:要看是不是用了索引/主键.没用索引/主键的话就是表锁,否则就是是行 ...

  3. select......for update会锁表还是锁行。

    select查询语句是不会加锁的,但是select .......for update除了有查询的作用外,还会加锁呢,而且它是悲观锁. 那么它加的是行锁还是表锁,这就要看是不是用了索引/主键. 没用索 ...

  4. select……for update会锁表还是锁行

    结果: 如果查询条件用了索引/主键,那么select - for update就会进行行锁. 如果是普通字段(没有索引/主键),那么select - for update就会进行锁表. 例如: 行锁例 ...

  5. select......for update会锁表还是锁行

    select查询语句是不会加锁的,但是 select -for update 除了有查询的作用外,还会加锁呢,而且它是悲观锁. 那么它加的是行锁还是表锁,这就要看是不是用了索引/主键.没用索引/主键的 ...

  6. select......for update会锁表还是锁行?

    select查询语句是不会加锁的,但是select .......for update除了有查询的作用外,还会加锁呢,而且它是悲观锁. 那么它加的是行锁还是表锁,这就要看是不是用了索引/主键. 没用索 ...

  7. select .... for update究竟锁表还是锁行?

    文章目录 介绍 实例验证 实例前准备数据 实例1--验证通过主键索引查询会锁行 实例2--验证通过普通索引作为查询条件会锁行 实例3--验证查询条件不命中索引会锁表 实例4--验证联合索引匹配到第一个 ...

  8. oracle update 锁表还是锁行,for update造成的Oracle锁表与解锁

    我遇到的情况: 当使用select语句查询表时,后面跟着for update , select * from table for update 当修改表中数据,但是没有commit就关掉PL/SQL, ...

  9. Oracle锁表 行级锁 表级锁 行级锁

    2019独角兽企业重金招聘Python工程师标准>>> Oracle锁表  行级锁  表级锁 ---- 行被排他锁定 ----在某行的锁被释放之前,其他用户不能修改此行       ...

  10. mysql行级锁 表级锁 页级锁详细介绍_MySQL行级锁、表级锁、页级锁详细介绍

    页级:引擎 BDB. 表级:引擎 MyISAM , 理解为锁住整个表,可以同时读,写不行 行级:引擎 INNODB , 单独的一行记录加锁 表级,直接锁定整张表,在你锁定期间,其它进程无法对该表进行写 ...

最新文章

  1. 谷歌最新视频抠图术:影子烟雾都能抠,添加水印更顺滑,UP主剪辑利器 | 开源...
  2. 4G EPS 中建立 UE 与 eNB 之间的 RRC 连接
  3. 文件,文件夹基本操作
  4. canvas rotate 累加旋转_【教研动态】音乐活动中,使用材料累加情境的适宜性
  5. mybatis三种(查询,参数传递)
  6. 使用r语言做garch模型_使用GARCH估计货币波动率
  7. CM3计算板读取SHT30以及I2C驱动
  8. kohana3 数据库模块配置
  9. art-template用户注册方法
  10. oracle数据库sql的执行过程,Oracle体系结构之SQL语句的执行过程
  11. A Simple Math Problem 矩阵打水题
  12. 【Git/Github学习笔记】Git常用命令(代码冲突)
  13. importanturlAndutl
  14. EPPlus.Core 1.5.4 报错 font '?' cannot be found docker core运行时2.1.0 alpine镜像 缺失微软字体...
  15. PHP微信公众号授权登录
  16. java设计求圆的面积周长的代码_java编程 1.设计一个求圆的面积和周长的类,要求:1计算当半径r=10和20时,圆的面积,并显示出来 、...
  17. 鲸探NFT数字臧品系统开发技术分享
  18. conda删除虚拟环境
  19. 虚拟宠物手机游戏《我的安吉拉2》上线华为AppGallery;Airbiquity宣布将扩张到非汽车市场 | 全球TMT...
  20. nexus+7+android+5.0++wifi+代理,二代Nexus 7获Android 5.0.2系统更新

热门文章

  1. 三层交换机和二层交换机的区别 三层交换机和路由器的区别
  2. 基于Matlab/Simulink的气液缓冲器动态特性仿真与分析
  3. 新球场,新球衣,新号码,现在,终于到了年轻人一闯天下的时候!
  4. 什么是闭包? 闭包有哪些优缺点?
  5. SQL-server第三次实验(单表查询)
  6. 3、字节流与字符流的区别
  7. 专家展望未来5年深度学习发展趋势
  8. K3S系列文章-使用AutoK3s在腾讯云上安装高可用K3S集群
  9. 众元教育H3CSE20200603班-黑洞路由和路由黑洞的区别
  10. IDEA配置JavaFX环境