讲师中心 微信公众号
AI工具推荐 视频效率加速

如何处理PL/SQL中的并发更新_FOR UPDATE与NOWAIT锁机制解析

云宇酱_6970

云宇酱_6970

发布时间:2026-03-22 09:28:03

|

298人浏览过

|

来源于php中文网

原创

SELECT ... FOR UPDATE只锁查询结果集中的行,事务提交或回滚后释放;不阻塞读操作和未加锁的更新;需配合索引、显式事务和执行计划验证确保锁粒度精准。

PL/SQL里SELECT ... FOR UPDATE到底锁什么?

它只锁查询结果集中的行,不是整张表,也不是执行语句的会话本身。锁在事务提交或回滚后才释放,不是语句执行完就松开。

常见错误是以为加了FOR UPDATE就能防止所有并发修改——其实它不阻止其他会话读(SELECT),也不阻止没加锁的更新(比如直接UPDATE t SET x=1 WHERE id=5),只让其他会话在尝试对同一行加锁时阻塞或报错。

  • 必须在事务内使用,单独执行后不提交,锁一直挂着
  • 如果查询没走索引、返回大量行,锁粒度大,容易引发争用
  • FOR UPDATE OF col_name只是语义提示,实际锁的仍是整行,不是单列

SELECT ... FOR UPDATE NOWAIT报ORA-00054: resource busy怎么处理?

这不是异常,是预期行为:说明目标行正被另一个未提交事务持有锁。不能靠重试掩盖,得设计应对逻辑。

典型场景是抢号、库存扣减、订单生成等需要“要么立刻拿到,要么放弃”的操作。盲目捕获ORA-00054然后sleep再试,反而可能拖垮系统。

  • 应用层应明确区分“业务不可用”和“暂时冲突”,前者返回用户友好提示(如“已被他人抢先下单”)
  • 避免在存储过程中隐式重试——PL/SQL里用EXCEPTION WHEN OTHERS THEN兜底重试,容易掩盖真正错误
  • 真要重试,建议用带退避的客户端逻辑(如指数退避),且设置最大重试次数

为什么FOR UPDATE SKIP LOCKED比NOWAIT更适合队列消费?

它不报错,而是跳过被锁的行,返回当前可用的行集合。适合多消费者并发拉取任务,天然避免争抢同一行。

比如消息队列表、待处理工单表,多个工作进程同时执行SELECT ... FOR UPDATE SKIP LOCKED,各自拿到不同行,互不阻塞。

  • SKIP LOCKED是Oracle 11gR2+才支持,低版本别用
  • 不能和NOWAIT混用,语法冲突
  • 注意配合ROWNUM或FETCH FIRST限制返回条数,否则可能一次扫太多行影响性能
  • 如果业务要求“严格顺序处理”,它反而不合适——因为跳过的行下次可能被别的进程拿走

用FOR UPDATE时最容易被忽略的三个点

一是自动提交陷阱:AUTOCOMMIT开启时(如SQL*Plus默认),每条语句结束即提交,锁瞬间释放,根本起不到保护作用;二是游标生命周期:在PL/SQL中用OPEN cur FOR SELECT ... FOR UPDATE,锁直到CLOSE或事务结束才释放,不是FETCH完就松;三是隐式类型转换导致索引失效——本想锁某ID,却因传入字符串触发全表扫描,锁住几百行,别人一查就卡住。

  • 检查会话AUTOCOMMIT状态:SHOW AUTOCOMMIT(SQL*Plus)或看应用连接配置
  • 显式控制事务边界,尤其在存储过程中避免依赖隐式提交
  • 执行前用EXPLAIN PLAN确认执行计划是否走了预期索引
锁的本质是协调,不是魔法。行锁生效的前提是能精准定位到行——索引、谓词、事务边界,三者缺一不可。写完FOR UPDATE别急着测功能,先看执行计划和锁视图V$LOCK。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

4263

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

891

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

1109

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

6161

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

3023

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

6140

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

8281

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

1130

2024.04.29

Linux 新手先学哪些命令
Linux 新手先学哪些命令

Linux新手命令专题汇集终端基础、文件目录操作、文本查看、软件安装和权限管理等入门文章,帮助按实际任务练习常用命令并建立命令行操作习惯。

0

2026.10.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn