mysql的行锁具体是怎么工作的

mysql行级锁是怎么工作的?
加锁的对象是索引,加锁的基本单位是 next-key lock。在能使用记录锁或者间隙锁就能避免幻读现象的场景下, next-key lock 就会退化成记录锁或间隙锁。
锁的范围,总结一下就是,对于唯一索引,锁只有对应的记录或者所在范围即可;非唯一索引则要看看可能加上一个范围,因为即使找到了索引也是非唯一的。
这个比较复杂,请移步这篇博客以及这篇博客

假设锁定读查询用到索引,就会锁住二级索引对应位置和查询到的记录的主键索引(没查到就不用锁主键索引)。如果锁定读查询语句,没有使用索引列作为查询条件,或者查询语句没有走索引查询,导致扫描是全表扫描。那么,每一条记录的索引上都会加 next-key 锁,这样就相当于锁住的全表,这时如果其他事务对该表进行增、删、改操作的时候,都会被阻塞。

不只是锁定读查询语句不加索引才会导致这种情况,update 和 delete 语句如果查询条件不加索引,那么由于扫描的方式是全表扫描,于是就会对每一条记录的索引上都会加 next-key 锁,这样就相当于锁住的全表。

因此,在线上在执行 update、delete、select … for update 等具有加锁性质的语句,一定要检查语句是否走了索引,如果是全表扫描的话,会对每一个索引加 next-key 锁,相当于把整个表锁住了,这是挺严重的问题。

相关推荐

  1. mysql具体怎么工作

    2023-12-11 11:34:01       64 阅读
  2. MySQLFor Update

    2023-12-11 11:34:01       38 阅读
  3. MySQL,,排它,共享

    2023-12-11 11:34:01       56 阅读
  4. Mysql正经、间隙和临键

    2023-12-11 11:34:01       63 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-11 11:34:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-11 11:34:01       101 阅读
  3. 在Django里面运行非项目文件

    2023-12-11 11:34:01       82 阅读
  4. Python语言-面向对象

    2023-12-11 11:34:01       91 阅读

热门阅读

  1. leetcode周赛375 - 12 - 10

    2023-12-11 11:34:01       63 阅读
  2. redis底层数据结构之ziplist实现

    2023-12-11 11:34:01       60 阅读
  3. 如何利用jQuery来向一个元素中添加和移除CSS类?

    2023-12-11 11:34:01       60 阅读
  4. JWT的原理

    2023-12-11 11:34:01       49 阅读
  5. 尼科彻斯定理

    2023-12-11 11:34:01       59 阅读
  6. 工业相机与镜头选型方法(含实例)

    2023-12-11 11:34:01       56 阅读
  7. Peter算法小课堂—差分数组

    2023-12-11 11:34:01       61 阅读
  8. 使用python统计字符串中字母个数的函数程序设计

    2023-12-11 11:34:01       68 阅读
  9. 7.1 C++11指针空值—nullptr

    2023-12-11 11:34:01       54 阅读
  10. synchronized和volatile的区别

    2023-12-11 11:34:01       52 阅读
  11. 基于AidLux的工业视觉少样本缺陷检测实战

    2023-12-11 11:34:01       67 阅读
  12. iOS 防截屏方法(一)

    2023-12-11 11:34:01       60 阅读