当前位置: 首页 > news >正文

MySQL 中,SELECT ... FOR UPDATE

在 MySQL 中,SELECT ... FOR UPDATE 语句会对查询结果集中的行加排他锁(X 锁)。关于其他事务是否能读取当前行,以下是详细说明:


1. 排他锁(X 锁)的特性

  • 排他锁是一种独占锁,加锁后:
    • 其他事务无法对相同的行加任何类型的锁(包括共享锁和排他锁)。
    • 其他事务无法修改或删除被锁定的行。
  • 读取行为
    • 在默认的隔离级别(REPEATABLE READ 或 READ COMMITTED)下,其他事务可以读取被锁定的行,但读取的是锁之前的快照数据(即不加锁的读取)。
    • 在 READ UNCOMMITTED 隔离级别下,其他事务可以读取未提交的数据。

2. 不同隔离级别下的行为

(1) READ UNCOMMITTED
  • 其他事务可以读取被锁定的行,甚至可能读取到未提交的数据(“脏读”)。
(2) READ COMMITTED
  • 其他事务可以读取被锁定的行,但读取的是锁之前的已提交数据(快照数据)。
(3) REPEATABLE READ(MySQL 默认隔离级别)
  • 其他事务可以读取被锁定的行,但读取的是事务开始时的快照数据。
(4) SERIALIZABLE
  • 其他事务无法读取被锁定的行,直到锁被释放。

3. 示例

假设有两个事务:事务 A 和事务 B。

  • 事务 A 执行:

    START TRANSACTION;
    SELECT * FROM users WHERE id = 1 FOR UPDATE;
    

    此时,事务 A 对 id = 1 的行加了排他锁。

  • 事务 B 尝试读取:

    START TRANSACTION;
    SELECT * FROM users WHERE id = 1;
    

    在默认的 REPEATABLE READ 隔离级别下,事务 B 可以读取 id = 1 的行,但读取的是事务 A 加锁之前的快照数据。


4. 总结

  • SELECT ... FOR UPDATE 会对查询结果集中的行加排他锁(X 锁)。
  • 其他事务是否能读取当前行
    • 在 READ UNCOMMITTEDREAD COMMITTED 和 REPEATABLE READ 隔离级别下,其他事务可以读取被锁定的行,但读取的是快照数据。
    • 在 SERIALIZABLE 隔离级别下,其他事务无法读取被锁定的行,直到锁被释放。

因此,SELECT ... FOR UPDATE 主要用于防止其他事务修改或删除被锁定的行,但通常不会阻止其他事务读取快照数据。

http://www.dtcms.com/a/54108.html

相关文章:

  • 游戏引擎学习第140天
  • 【C++】Class(1)
  • 虚拟机 | Ubuntu图形化系统: open-vm-tools安装失败以及实现文件拖放
  • 数据可视化大屏产品设计方案(附Axure源文件预览)
  • 【JavaSE-7】方法的使用
  • 【C语言】函数篇
  • 安装remixd,在VScode创建hardhat
  • 软考架构师笔记-数据库系统
  • 确认机制的分类及其区别与联系探讨
  • 在springboot项目中引入log4j 2.x
  • mysql进阶(三)
  • 【CSS 】Class Variance Authority CSS 类名管理工具库
  • JVM与性能调优详解
  • 香港电讯CE2.0网络全面升级,100G服务支援企业关键应用
  • Unity InputField + ScrollRect实现微信聊天输入框功能
  • unity学习64,第3个小游戏:一个2D跑酷游戏
  • 如何用更少的内存训练你的PyTorch模型?深度学习GPU内存优化策略总结
  • Linux 上离线安装 python3
  • 哪些培训课程适合学习PostgreSQL中级认证知识?
  • 前端Vue3面试题
  • blender 坐标系 金属度
  • 基于多目标向日葵优化算法(Multi-objective Sunflower Optimization,MOSFO)的移动机器人路径规划研究,MATLAB代码
  • 小程序路径复制
  • 18年老牌软件,完美解锁pro!
  • Java 导出大数据到 Excel 表格
  • DeepSeek group-limited expert routing和负载均衡
  • Secret Cow Code S
  • PS内发光、外发光
  • 关于读写锁:有个线程在读,能写吗?有个线程在写,能读吗?
  • python 同一行显示多条语句