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

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.kler.cn/a/574073.html

相关文章:

  • Vue父子组件传递笔记
  • 向量数据库Chroma的介绍
  • 96.在 Vue 3 中使用 OpenLayers 探究加载 Point、Polygon 的极限
  • upload-labs详解(1-12)
  • 如何下载安装 PyCharm?
  • 备考六级:词汇量积累(day4)
  • 三参数水质在线分析仪:从源头保障饮用水安全
  • aardio - 虚表 —— 两个虚表之间互相拖动交换数据
  • 走进聚类的世界:用日常例子解释复杂的算法概念
  • npm install 报错 no such file or directory 的解决方法
  • GoLang的select是什么?在什么时候场景下用
  • Unity多Pass渲染与GPU Instancing深度优化指南
  • OpenCV计算摄影学(16)调整图像光照效果函数illuminationChange()
  • 浅谈Manus智能体与其他AI助手(如ChatGPT、Claude等)的优势
  • 【C++进阶学习】第一讲——继承(下)---深入挖掘继承的奥秘
  • JS—组成:2分钟掌握什么是ECMAScript操作,什么是DOM操作,什么是BOM操作
  • 利用Python爬虫获取17网(17zwd)商品详情:实战指南
  • MySQL学习笔记(3)InnoDB存储引擎对MVCC的实现
  • 计算机毕业设计SpringBoot+Vue.js青年公寓服务平台(源码+文档+PPT+讲解)
  • 深度学习中TorchScript原理、作用浅析(Trace/Script)