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

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;
http://www.jsqmd.com/news/792319/

相关文章:

  • DBO-Transformer模型回归+SHAP分析+新数据预测+多输出!深度学习可解释分析(附MATLAB代码)
  • CodeWiki代码解读工程
  • 驾驶中的疲劳状态识别数据集分享(适用于YOLO系列深度学习分类检测任务)
  • RPGMZ 战斗结束 移除死亡的角色 并且显示一个消息框 然后结束战斗
  • 武昌/汉口/汉阳找家教:武汉本地老牌大学生家教平台深度测评分:区域走访华中师大家教网,三镇家长的真实满意率是怎么来的 - 教育信息速递
  • 2026届学术党必备的六大AI写作神器推荐
  • 空间智能破界 实景孪生新生
  • 告别ContentProvider臃肿初始化,App Startup实战指南
  • Joy-Con Toolkit:开源手柄调试工具的技术实现与应用
  • 构建个人数字记忆库:微信聊天记录的永久保存与深度分析方案
  • 武汉大学生上门家教一般多少钱?怎么付才最安全不被卷款?——华中师大家教网坚持15年的费用规则:按周月结、直付老师、不预支 - 教育信息速递
  • 内容创作团队如何利用Taotoken调用不同模型生成多样化素材
  • 2026年4月异型钢采购推荐,不锈钢筛管/不锈钢筛板/异型钢/不锈钢型材/三角丝,异型钢批发怎么选择 - 品牌推荐师
  • .NET性能优化:提升Apache Arrow读写性能
  • 以像素解构实景 以孪生赋能城域
  • 一款基于 .Net WinForm 开发的节点编辑器,纯 GDI 实现,体积仅 100+Kb
  • DS4Windows终极指南:3步解决PS4手柄在Windows的游戏兼容问题
  • RPGMZ 万能通用钩子代码 插入自己的代码逻辑
  • 测试包含numpy模块的pocketpy:pocketpy-numpy
  • 在Node.js后端项目中集成Taotoken实现稳定的大模型API调用
  • 软件工程团队第一次作业
  • 如何快速掌握OpenCore配置:面向新手的完整指南
  • 原生视频筑底 全域镜像共生
  • FPGA实战:一种精简可配置位宽的SPI主机Verilog实现
  • 终极视频下载解决方案:VideoDownloadHelper完全使用指南
  • 靠谱糯米鸡机器厂家选择:企业采购决策关键因素分析
  • PCL2启动器:Minecraft玩家的终极免费启动工具完全指南
  • ARC 219
  • 北京中小微企业专属GEO优化服务|余小铁GEO 高性价比本地营销方案 - 余小铁
  • 从数据到模型:Musdb18分轨数据集与Python库Musdb实战指南