在 YashanDB 中执行某些 DDL 或 DML 语句时,如果涉及到锁竞争,就可能遇到如下报错:

YAS-02024 lock wait timeout, wait time 0 milliseconds

这种情况看似突然,其实和数据库默认的锁等待设置有关。本文将带你快速定位原因,并提供实用的规避方法。

一、问题描述

执行如下 SQL 时报错:

​
alter table ...;
-- 或
update/delete ... where ...;

控制台提示:

YAS-02024 lock wait timeout, wait time 0 milliseconds​

语句因未能获取锁而直接失败。

二、根本原因分析

YashanDB 默认的锁等待超时时间为 0 秒,即如果当前 SQL 执行时请求的资源已被其他会话占用:

数据库不会等待;

而是立即返回锁等待超时错误。

三、适用范围

image.png
四、解决办法

方法一:临时或永久修改锁等待超时时间

-- 修改为等待 300 秒(单位:秒)

alter system set DDL_LOCK_TIMEOUT = 300;​

修改后将自动同步更新到配置文件 config/yasdb.ini,实现持久化。

方法二:找出阻塞源并终止会话

1、查询当前锁定信息:

select * from v$lock;​
2、关联查找会话信息:

select * from v$session;​
3、手动终止阻塞会话:

alter system kill session 'SID,SERIAL#';
-- 示例:alter system kill session '30,918';​

4、批量终止锁表会话(适用于大量阻塞情况):


select 
  'alter system kill session ''' || sid || ',' || serial# || ''';' 
from 
  v$session t1, 
  v$locked_object t2 
where 
  t1.sid = t2.session_id;​

将输出的 SQL 批量复制执行即可。

五、预防建议

image.png
六、总结

锁等待超时并非系统 bug,而是默认策略的结果。在开发环境或测试环境中,合理配置 DDL_LOCK_TIMEOUT 和清理无效会话,是避免 YAS-02024 报错最直接的方式。对生产环境,建议引入锁等待监控机制,及时发现并处理长时间占锁行为。


数据库砖家
1 声望0 粉丝