在 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 执行时请求的资源已被其他会话占用:
数据库不会等待;
而是立即返回锁等待超时错误。
三、适用范围
四、解决办法
方法一:临时或永久修改锁等待超时时间
-- 修改为等待 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 批量复制执行即可。
五、预防建议
六、总结
锁等待超时并非系统 bug,而是默认策略的结果。在开发环境或测试环境中,合理配置 DDL_LOCK_TIMEOUT 和清理无效会话,是避免 YAS-02024 报错最直接的方式。对生产环境,建议引入锁等待监控机制,及时发现并处理长时间占锁行为。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。