SELECT FOR UPDATE 是怎么使用的?

聊聊select for update到底加了什么锁 最近在开发需求的时候,用到了。在代码评审的时候,一位同事说 ,唯一索引+一个非索引字段,是否可能会锁全表呢?本文田螺哥将通过9个实验操作的例子,给大家验证到底加了什么锁,是表锁还是行锁。这是本文的提纲哈:因为加锁是跟数据库的隔离级别息息相关的。而常用的数据库隔离级别也就RC(读已提交)和RR(可重复读),所以本文分别根据RC(读已提交) 和 RR(可重复读)隔离级别展开讲述。我是捡田螺的小男孩。通过本文,大家学到哪些知识点呢?在不同场景,都加了什么锁。 阅读详情

SELECT ... FOR UPDATE 是 InnoDB 提供的行级排他锁语法,用来在事务内把“查到的行”锁住,防止其他事务同时改或删,实现悲观锁流程。


1. 最基本用法

START TRANSACTION;

SELECT balance
FROM account
WHERE id = 100
FOR UPDATE;          -- 给 id=100 这一行加排他锁(X锁)

-- 业务逻辑:判断、计算、更新
UPDATE account
SET balance = balance - 100
WHERE id = 100;

COMMIT;              -- 锁自动释放
  • 锁范围:命中索引时是行锁;无索引退化为间隙锁或表锁 → 注意覆盖索引/主键
  • 持有时间:从语句执行成功直到事务提交/回滚

2. 多行/范围锁定

-- 锁住余额小于 0 的所有账户(范围锁)
SELECT id
FROM account
WHERE balance < 0
FOR UPDATE;

其他事务无法插入/更新/删除 balance < 0 的行,直到本事务结束。


3. 与 LOCK IN SHARE MODE 区别

锁类型语法作用并发
排他锁FOR UPDATE读写都阻塞悲观写
共享锁LOCK IN SHARE MODE读允许,写阻塞悲观读

4. 超时控制

-- 等 3 秒拿不到锁就报错(InnoDB 5.7+)
SELECT ... FOR UPDATE NOWAIT;     -- 立即报错
SELECT ... FOR UPDATE SKIP LOCKED; -- 跳过已锁行,返回空结果
SELECT ... FOR UPDATE WAIT 3;     -- 等待 3 秒(MySQL 8.0)

5. 常见坑

  • 无索引 → 退化为表锁或间隙锁 → 并发骤降
  • 长事务 → 锁持有时间长 → 阻塞/死锁概率飙升
  • 快照读(REPEATABLE READ)下,FOR UPDATE 会升级成当前读,可能产生幻读 → 需要范围锁/间隙锁

一句话记忆

SELECT ... FOR UPDATE = “把查到的行当场加写锁,直到事务结束”,用来实现悲观并发控制;务必走索引、尽量短事务、按需设置超时。

记录select for update mysql 死锁问题 背景 项目要求某表单个列自增,但是where条件,并不是这个列所有的值都符合自增 想用select for update mysql 锁表后,查询最大值自增,后发现有死锁问题,先记录一下。 实例 以下代码在可重复读隔离级别下执行,表中原来只有1~10的rank。假如A、B两个事务同时试图插入rank为21和22的rank; @Transactional public void createBannerDeadlock(Banner banner) { banner.r 阅读详情

相关推荐

面试必问 什么时候使用select for update 和version

在数据库并发控制中,SELECT FOR UPDATE 和 VERSION(乐观锁)是两种常用的解决数据一致性问题(而非“防止AI检测”,可能是表述误差)的手段,主要应对多事务并发修改同一数据时的​​脏读、不可重复读、幻读​​等问题

🚩 Flag:今年绝不写屎山代码(去年也是这么说的) 690

select ... for update学习

select ... for update

难顶货的博客 1万+

数据库中的select for update语句中使用的锁是什么?

在数据库中,select for update语句是一种用于实现并发控制的机制,它允许一个事务在读取数据的同时锁定选定的行,以防止其他事务对这些行进行修改。在MySQL中,select for update语句会为选定的行加上共享锁(shared lock),这种锁可以防止其他事务对这些行进行修改,但允许其他事务读取这些行。在事务结束后,共享锁会自动释放。需要注意的是,在事务结束前,其他事务无法修改John的薪水信息,因为我们使用了select for update语句为John的薪水信息加上了共享锁。

2301_79331230的博客 493

select...for update锁详解

如果A事务中执行了select...for update,那么在其提交或回滚事务之前,B,C,D...事务是无法操作(写)A事务select...for update所命中的数据的!那是锁表还是锁行呢?

但行好事,莫问前程 1万+

ODS 与模态分析

模态分析不是通过现有的 FRF 来“推测”或“估计”其他模态参数,而是通过测量和分析 FRF 来。

轩辕霸天L 1260

PADS导出PCB正反面丝印为CAD文件的方法

本文介绍如何将PADS绘制的pcb格式的PCB文件顶底层丝印及板框导出为CAD的dxf文件格式,并且将底层丝印进行镜像为正常视角

luguodeyo的博客 3294

SELECT... FOR UPDATE 排他锁

SELECT… FOR UPDATE 排他锁 1. SELECT…FOR UPDATE 是什么?作用是什么? select for update 即排他锁,排他锁又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他锁并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。 作用:保证数据的一致性,为了在查询时,避免其他用户对该表进行插入,修改或删除等操作,造成表数据的不一致性。 2. MYSQL中如何查询是否存在锁信息?

屠龙少年 1万+

十一、学生信息管理系统(PyQt5+MySQL+PyMySQL模块实现)

学生信息管理系统(PyQt5+MySQL+PyMySQL模块实现)

ungoing的博客 8991

mysql sql select for update_mysql SELECT FOR UPDATE语句使用示例

以MySQL 的InnoDB 为例,预设的Tansaction isolation level 为REPEATABLE READ,在SELECT 的读取锁定主要分为两种方式:SELECT ... LOCK IN SHARE MODE SELECT ... FOR UPDATE这两种方式在事务(Transaction) 进行当中SELECT 到同一个数据表时,都必须等待其它事务数据被提交(Commi...

weixin_29216353的博客 768

WebUI自动化测试框架搭建(python+pytest+selenium+allure)

将鼠标移动到要定位的元素上面>右键>点击“检查”>在元素代码上右键>复制>复制XPath。

m0_63729339的博客 1281

保姆级图解:FD-SOI工艺流程中的关键三步(外延生长、应变硅、HKMG)

本文详细解析了FD-SOI工艺流程中的三大关键技术:外延生长、应变硅工程和HKMG集成。通过选择性外延生长技术优化接触电阻,利用应变硅提升载流子迁移率,并结合先栅高k金属栅工艺实现精准栅极控制,FD-SOI技术在智能手机处理器和自动驾驶芯片制造中展现出卓越的低功耗与高性能平衡。

weixin_29267307的博客 490

MySQL SELECT FOR UPDATE语句使用示例

本文介绍在mysql中使用mysql SELECT FOR UPDATE 语句时的一些问题与解决办法 以MySQL 的InnoDB 为例,预设的Tansaction isolation level 为REPEATABLE READ,在SELECT 的读取锁定主要分为两种方式: ① SELECT ... LOCK IN SHARE MODE ② SELECT ... FOR UPDATE 这两种方式在事务(Transaction) 进行当中SELECT 到...

西楼的博客 646

2.1 直流无刷电机(BLDC):机械结构与组件

本文详细解析了直流无刷电机(BLDC)的机械结构与核心组件。BLDC电机通过电子换向取代传统机械电刷,主要包含定子、转子、位置传感器和电子换向器四大组件。定子采用硅钢片叠压结构,配有三相绕组;转子采用永磁体材料,结构设计影响转矩特性;位置传感器(霍尔、编码器、旋转变压器)实现精准换向;电子换向器通过功率逆变拓扑完成电流控制。文章还对比了不同绕组类型、永磁材料及传感器技术的性能特点,为BLDC电机的设计与应用提供了理论基础。

技术工作者 388

mysql select for_MySQL在事务中使用SELECT ... FOR UPDATE

在数据库的操作中,经常发生数据并发更新的情况,这时可以使用SELECT … FOR UPDATE语句对数据加锁保证数据更新的正常执行。下图所示为一张学生成绩表,现在开启两个终端会话模拟数据的并发操作。(开启终端会话可以使用MySQL Shell,安装和使用方法详见另一篇博文如何使用MySQL Shell连接数据库)先开启第一个会话,依次执行以下语句将id为3的记录中数学成绩加10:start tr...

weixin_42443797的博客 805

手把手教你学Simulink--逆变器场景:基于Simulink的单相全桥逆变器PWM控制仿真建模

本文介绍了使用Simulink和Simscape Electrical库进行单相全桥逆变器PWM控制仿真建模的详细步骤。主要内容包括:从创建Simulink项目、添加电力电子组件、构建逆变器模型,到设置参数、运行仿真和结果分析。重点讲解了逆变器核心模块的配置、PWM信号生成、负载建模等关键环节,并提供了优化改进建议。该指南适用于电力电子初学者,通过仿真可以帮助理解单相全桥逆变器的工作原理和PWM控制技术,为实际应用和算法开发提供基础平台。

MHD0815的博客 665

基于sklearn实现LDA主题模型(附实战案例)

目录LDA主题模型1.LDA主题模型原理2.LDA主题模型推演过程3.sklearn实现LDA主题模型(实战)3.1数据集介绍3.2导入数据3.3分词处理 3.4文本向量化3.5构建LDA模型3.6LDA模型可视化 3.7困惑度 其实说到LDA能想到的有两个含义,一种是线性判别分析(Linear Discriminant Analysis),一种说的是概率主题模型:隐含狄利克雷分布(Latent Dirichlet Allocation,简称LDA)。 现在讨论的是主题模型

m0_64336780的博客 2万+

MySQL在事务中使用SELECT ... FOR UPDATE

在数据库的操作中,经常发生数据并发更新的情况,这时可以使用SELECT … FOR UPDATE语句对数据加锁保证数据更新的正常执行。 下图所示为一张学生成绩表,现在开启两个终端会话模拟数据的并发操作。(开启终端会话可以使用MySQL Shell,安装和使用方法详见另一篇博文如何使用MySQL Shell连接数据库) 先开启第一个会话,依次执行以下语句将id为3的记录中数学成绩加10: start transaction; select * from test where id = 3 for upda

baodong 2253

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

关于 UPDATE 语句 和 SELECT ... FOR UPDATE 的对比分析,包括语法、功能、锁机制、使用场景及示例代码

关于 UPDATE 语句 和 SELECT ... FOR UPDATE 的对比分析,包括语法、功能、锁机制、使用场景及示例代码

爱的叹息的专栏 814

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

MySQL update For_mysql SELECT FOR UPDATE语句使用示例

以MySQL 的InnoDB 为例,预设的Tansaction isolation level 为REPEATABLE READ,在SELECT 的读取锁定主要分为两种方式:SELECT ... LOCK IN SHARE MODE SELECT ... FOR UPDATE这两种方式在事务(Transaction) 进行当中SELECT 到同一个数据表时,都必须等待其它事务数据被提交(Commi...

weixin_39646706的博客 187

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

mysql for update_mysql SELECT FOR UPDATE语句使用示例

以MySQL 的InnoDB 为例,预设的Tansaction isolation level 为REPEATABLE READ,在SELECT 的读取锁定主要分为两种方式:SELECT ... LOCK IN SHARE MODE SELECT ... FOR UPDATE这两种方式在事务(Transaction) 进行当中SELECT 到同一个数据表时,都必须等待其它事务数据被提交(Commi...

weixin_39548832的博客 116

数据库中update怎么用事例_mysql SELECT FOR UPDATE语句使用示例

以MySQL 的InnoDB 为例,预设的Tansaction isolation level 为REPEATABLE READ,在SELECT 的读取锁定主要分为两种方式:SELECT ... LOCK IN SHARE MODE SELECT ... FOR UPDATE这两种方式在事务(Transaction) 进行当中SELECT 到同一个数据表时,都必须等待其它事务数据被提交(Commi...

weixin_39959192的博客 251

java 中update会锁表吗,java – JDBC使用SELECT FOR UPDATE锁定一行,不起作用

我遇到MySQL的SELECT问题.. FOR UPDATE,这是我试图运行的查询:SELECT * FROM tableName WHERE HostName='UnknownHost'ORDER BY UpdateTimestamp asc limit 1 FOR UPDATE在此之后,相关的线程将执行UPDATE并更改HostName,然后它应该解锁该行.我正在运行一个多线程的java应用程...

weixin_39654436的博客 836

select...for update使用方法

作用: select for update 是为了在查询时,避免其他用户以该表进行插入,修改或删除等操作,造成表的不一致性. 给你举几个例子: select * from t for update 会等待行锁释放之后,返回查询结果。 select * from t for update nowait 不等待行锁释放,提示锁冲突,不返回结果 select * from t for update wa...

鲨鱼辣椒灬的博客 5万+

mysql SELECT FOR UPDATE语句使用示例

mysql SELECT FOR UPDATE语句使用示例 作者: 字体:[增加 减小] 类型:转载 本文介绍在mysql中使用mysql SELECT FOR UPDATE 语句时的一些问题与解决办法 以MySQL 的InnoDB 为例,预设的Tansaction isolation level 为REPEATABLE READ,在SELECT 的读取锁定主要分为两种方

taotoxht的专栏 1069
上一篇: 金融支付系统高并发架构设计文档
下一篇: 滑动时间窗口,找一段区间中的最大值
winfield821
博客等级 码龄16年 139粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值