本文摘自GBASE南大通用社区,by:wty,原文请点击:GBase 8s常见问题 -- 查找锁会话并解锁|GBASE社区|天津南大通用数据技术股份有限公司|GBASE-致力于成为用户最信赖的数据库产品供应商
问题现象
执行SQL时报错
244: Could not do a physical-order read to fetch next row.
154: ISAM error: Lock Timeout Expired
或者
107: ISAM error: record is locked.
或者
106: ISAM error: non-exclusive access.
这些报错都与锁相关,当你的一个SQL偶尔报类似错误,可能只是运气不好,碰巧执行的时候被锁了。
如果多次执行一直报锁,就需要考虑是不是有会话长时间锁住数据没有释放,需要强制结束掉这个会话来解锁。
解决方法
1)通过GBase Data Stdio解锁
打开数据库导航中,数据库连接下面的会话页面,在右侧会话页面中选择锁
找到被锁的表对应的锁会话ID
切换到会话页面找到刚才的会话ID,点右键,选择结束强制结束会话
2)通过SQL和命令行解锁
连接sysmaster系统库,查询syslocks系统表,查询锁信息,推荐使用where条件来筛选结果
[gbasedbt@test ~]$ dbaccess sysmaster -
Database selected.
> select * from syslocks;
dbsname wty_utf8
tabname aaa
rowidlk 0
keynum 0
type IX
owner 160
waiter
找到备锁表那一行数据对应的owner列里的会话ID
执行命令强制结束会话解锁
onmode -z 160
相关要点
107: ISAM error: record is locked.
这个报错一般是没有配置锁等待时间,导致碰到锁立刻就报错结束查询,配置锁等待时间可以大幅度减少锁相关的报错
106: ISAM error: non-exclusive access.
这个报错一般是正在对表执行alter table之类的修改表结构操作,也可能是正在创建索引,贸然强制结束锁会话可能会导致回滚,相关操作失败。建议先确定操作源头再考虑等待执行完毕还是强制解锁。
如果不需要获取特别准确的数据时,可以暂时将隔离级别设置为DIRTY READ,此模式不管数据是否已经提交都会直接读取,不需要进行解锁就可以查出数据。