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

ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源 或者超时失效

数据治理过程中,有字段长度不够,扩展字段,报:ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源 或者超时失效

ALTER TABLE LAPD_RSJ_CXJMYLBXCBXX MODIFY HKXZ VARCHAR2(10);

image.png

错误表示当前会话在试图访问的资源(通常是表或行)正被其他会话锁定,并且当前会话指定了 NOWAIT 参数,因此无法等待资源解锁就直接报错。
这种情况通常发生在执行 DDL 语句(例如 ALTER TABLE、DROP TABLE)或需要独占锁的操作时,而另一会话已经持有了共享锁或独占锁

NOWAIT 参数:在 Oracle 数据库中,NOWAIT 参数通常用于锁定或修改表时的 SQL 语句中,表示当前会话在请求资源时不等待,如果资源被其他会话锁定,立即返回错误,而不会进入等待状态。
如果所请求的行已经被其他会话锁定,该语句会立即返回 ORA-00054 错误,而不会等待锁的释放。

NOWAIT 参数的作用

不等待:NOWAIT 告诉 Oracle 如果资源被锁定,则不进入等待状态,直接报错。这对于一些短时间操作或快速执行的事务很有用,可以避免会话长时间等待锁定资源。
避免死锁:在并发环境中,NOWAIT 可以有效避免因锁等待导致的死锁问题。如果一个会话在请求资源时不能获取锁,它会直接报错,而不是进入等待。

应用场景

高并发系统:在高并发的环境下,为了快速检测和避免阻塞或等待,可以使用 NOWAIT 参数。
批处理或定时任务:在批处理脚本或定时任务中,加入 NOWAIT 可以防止脚本被长时间阻塞。当资源被锁时直接报错,并根据错误处理逻辑进行后续操作(如重试或跳过该任务)。
实时应用:对于某些实时性要求较高的应用程序,不希望等待锁释放,可以使用 NOWAIT 参数来确保程序不会被锁定资源阻塞。

NOWAIT 参数的缺点
虽然 NOWAIT 可以减少等待时间,但如果资源频繁被锁定,可能会导致频繁出错并影响程序的流畅性。因此,使用 NOWAIT 时,通常需要结合业务逻辑,设置重试机制或进行适当的错误处理。

解决方案

1. 等待资源解锁

最直接的方式是等待其他会话释放锁,然后重新执行语句。
如果你可以接受等待一段时间,可以将语句中的 NOWAIT 参数移除,这样当前会话会自动等待资源解锁。例如:

LOCK TABLE your_table IN EXCLUSIVE MODE;
用于将整个表加锁,但不等待其他会话释放锁。
如果表已被其他会话锁定,语句会立即返回 ORA-00054 错误。

或者

ALTER TABLE your_table MODIFY column_name datatype; -- 移除 NOWAIT 选项
如果表正被其他会话占用或锁定,这样的语句会立即返回 ORA-00054 错误
2. 找到并终止阻塞会话

如果无法等待资源解锁,可以查找和终止占用锁的会话。执行以下 SQL 语句可以找到当前持有锁的会话:

SELECT s.sid, s.serial#, s.username, s.osuser, s.program
FROM v$locked_object l
JOIN v$session s ON l.session_id = s.sid
JOIN dba_objects o ON l.object_id = o.object_id
WHERE o.object_name = 'LAPD_RSJ_CXJMYLBXCBXX';

--3880 50660

替换为实际表名。查询结果中可以找到 SID 和 SERIAL#,然后可以用这些信息终止阻塞会话:

ALTER SYSTEM KILL SESSION 'sid,serial#';
ALTER SYSTEM KILL SESSION '3880,50660';

注意:在生产环境中,杀掉会话可能会影响其他用户,需谨慎操作。

ORA-00054 错误的解决方法主要取决于是否可以等待锁释放、是否允许终止其他会话,或是否可以在程序中设置重试机制。

修改列长度

ALTER TABLE LAPD_RSJ_CXJMYLBXCBXX MODIFY HKXZ VARCHAR2(10);

image.png


http://www.kler.cn/a/381991.html

相关文章:

  • 2、光同步数字传送网的特点
  • 5G -- 5G网络架构
  • SpringBoot 启动类 SpringApplication 二 run方法
  • 集成自然语言理解服务,让应用 “听得懂人话”
  • springboot460实习生管理系统设计和实现(论文+源码)_kaic
  • List深拷贝后,数据还是被串改
  • Java并发常见面试题总结(下)
  • 25.停车场管理系统(基于web的Java项目)
  • SpringBoot day 1105
  • springcloud各组件说明
  • ctfshow(89,90,92,93)--PHP特性--intval函数
  • 【RDD算子的分类】RDD的转换算子和触发算子(行为算子)、以及各个算子的作用,对比sql中的关键字
  • 【系统架构设计师(第2版)】十一、未来信息综合技术
  • Hearts of Iron IV 之 Archive Modification
  • HTML+javaScript+CSS
  • 【个人记录】screen和tmux
  • “农田奇迹:如何用遥感技术实现作物分类与产量精准估算“
  • Java:获取HttpServletRequest请求参数
  • PostgreSQL 到 PostgreSQL 数据迁移同步
  • 计算机网络——网络层导论
  • 云渲染与汽车CGI图像技术优势和劣势
  • 用 Python 写了一个天天酷跑(附源码)
  • 【docker入门】docker的安装
  • vue3中setup的作用是什么?
  • ELK实现加载多个配置日志文件
  • Jest进阶:测试 Vue 组件