news 2026/5/10 23:20:41

MySQL-select ... for update语句详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL-select ... for update语句详解

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程https://www.captainai.net/troubleshooter

基本语法

SELECT ... FOR UPDATE [NOWAIT | SKIP LOCKED]

核心作用

  • 行级锁:对查询到的行加上排他锁(X锁)

  • 阻止修改:其他事务无法修改这些行(UPDATE/DELETE),也无法加共享锁

  • 阻塞读取:普通的SELECT不受影响,但其他SELECT FOR UPDATE会阻塞

使用示例

-- 开启事务 START TRANSACTION; -- 锁定id=1的行 SELECT * FROM accounts WHERE id = 1 FOR UPDATE; -- 基于锁定数据进行操作 UPDATE accounts SET balance = balance - 100 WHERE id = 1; -- 提交事务释放锁 COMMIT;

关键特性

特性说明
锁范围根据WHERE条件锁定行,无索引时可能锁表
释放时机事务提交或回滚时释放
隔离级别通常在REPEATABLE-READ或READ-COMMITTED下有效

高级选项

-- NOWAIT:立即返回错误而不等待 SELECT * FROM products WHERE id = 1 FOR UPDATE NOWAIT; -- SKIP LOCKED:跳过已被锁定的行 SELECT * FROM queue WHERE status = 'pending' ORDER BY priority DESC FOR UPDATE SKIP LOCKED;

典型应用场景

1.防止超卖

START TRANSACTION; SELECT stock FROM products WHERE id = 1 FOR UPDATE; IF stock > 0 THEN UPDATE products SET stock = stock - 1 WHERE id = 1; INSERT INTO orders (product_id) VALUES (1); END IF; COMMIT;

2.读取后修改

-- 获取当前余额并更新 START TRANSACTION; SELECT balance FROM accounts WHERE user_id = 100 FOR UPDATE; -- 在应用层计算新余额 UPDATE accounts SET balance = 900 WHERE user_id = 100; COMMIT;

3.队列消费

START TRANSACTION; SELECT * FROM task_queue WHERE status = 'todo' LIMIT 10 FOR UPDATE SKIP LOCKED; -- 处理任务 UPDATE task_queue SET status = 'processing' WHERE id IN (...); COMMIT;

⚠️ 注意事项

  • 需要事务:必须在START TRANSACTION或关闭自动提交后使用

  • 性能影响:锁持有期间阻塞其他事务,避免长事务

  • 死锁风险:多个事务互相等待对方释放锁

  • 锁定升级:全表扫描时会锁全表,务必使用索引

  • 释放时机:事务结束立即释放,不要依赖连接关闭

与其他锁对比

锁类型语句用途
共享锁SELECT ... LOCK IN SHARE MODE读数据,禁止修改
排他锁SELECT ... FOR UPDATE准备修改数据

最佳实践

-- ✅ 正确:使用索引 SELECT * FROM users WHERE id = 100 FOR UPDATE; -- ❌ 错误:可能锁全表 SELECT * FROM users WHERE name = '张三' FOR UPDATE; -- ✅ 推荐:尽量短的事务 START TRANSACTION; -- 快速操作 COMMIT;
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/10 23:15:27

RPGMZ 战斗结束 移除死亡的角色 并且显示一个消息框 然后结束战斗

个人记录保存 Project1论坛 小圈子 人才 不得学习我的技术 1. BattleManager.endBattle 不论是战斗失败 胜利 逃跑 都会走这个敌方 我们在这里显示我们的消息框 下面这段代码就是战斗结束 移除死亡的队员 并且显示一个消息框的代码功能 经过测试有效 const _BattleManager_…

作者头像 李华
网站建设 2026/5/10 23:14:46

3分钟搞定Hyper-V设备直通:DiscreteDeviceAssigner终极指南

3分钟搞定Hyper-V设备直通:DiscreteDeviceAssigner终极指南 【免费下载链接】DDA 实现Hyper-V离散设备分配功能的图形界面工具。A GUI Tool For Hyper-Vs Discrete Device Assignment(DDA). 项目地址: https://gitcode.com/gh_mirrors/dd/DDA 还在为Hyper-V…

作者头像 李华
网站建设 2026/5/10 23:09:52

短视频信息流的天才设计

据统计每天通过短视频平台观看的内容累计时长达到 616,572 年,平台的每一个细节,都经过精心设计以最大化用户停留时间 背后的三层设计逻辑: 界面设计 → 内容创作影响 → 算法推荐 1.1 为什么刷视频如此顺畅? 1.2 滑动机制: 消除…

作者头像 李华
网站建设 2026/5/10 23:09:17

Noto字体库完整指南:如何为全球项目选择完美字体解决方案

Noto字体库完整指南:如何为全球项目选择完美字体解决方案 【免费下载链接】noto-fonts Noto fonts, except for CJK and emoji 项目地址: https://gitcode.com/gh_mirrors/no/noto-fonts 当你开发面向全球用户的应用或网站时,是否曾遇到过这样的…

作者头像 李华
网站建设 2026/5/10 23:06:11

2025届毕业生推荐的五大AI辅助写作网站实际效果

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 眼下,在学术以及职场文本生成这个范畴里,AI检测率过高这样的问题越发…

作者头像 李华
网站建设 2026/5/10 23:00:42

从数据到模型:Musdb18分轨数据集与Python库Musdb实战指南

1. Musdb18数据集与音乐源分离 音乐源分离是音频处理领域的一个重要研究方向,它的目标是将混合音频中的不同音源(如人声、鼓、贝斯等)分离出来。这个技术在音乐制作、卡拉OK伴奏生成、语音增强等场景都有广泛应用。而要进行有效的音乐源分离模…

作者头像 李华