如果您执行SQL语句时候出现下面的错误提示:
244: Could not do a physical-order read to fetch next row.
113: ISAM error: the file is locked.
毫无疑问,您要访问的表被别人锁住了。
如果您的使用了 set lock mode to wait 语句,onstat -u 命令可以报告出会话在等待锁资源的信息(
标志位“L”),如:
c0000000379015e8 L--PR-- 4626 informix tJ c0000000006e45f0 20 1 0 0
超时后报错:
244: Could not do a physical-order read to fetch next row.
154: ISAM error: Lock Timeout Expired
那么,怎么样找出是谁锁住了这个表呢?介绍一个小技巧,执行下面SQL语句:
DATABASE sysmaster;
SELECT owner FROM syslocks WHERE tabname="表名";
得到的owner就是加锁的会话号SID,于是我们就可以使用 onstat -g ses SID 命令查看该会话的信息,
包括是哪个用户、执行了什么SQL语句。还可以通过DBA身份使用 onmode -z 命令杀断该会话。
czw1413_cn 回复于:2004-02-10 10:54:57
顶一下~~~~~~~~~
圣手again 回复于:2004-02-10 21:53:11
我有此这样的代码,到时贴出来看看
chenjiakai 回复于:2004-02-11 00:39:18
用IBM的ISA工具一下子就搞定了。
hseng 回复于:2004-02-11 08:39:38
up
satoni 回复于:2004-02-11 12:45:24
我也顶一下。。。
czw1413_cn 回复于:2004-02-11 13:40:04
建议楼主在发表主题的时候不要使用“原创“
amiescort 回复于:2004-02-11 19:37:47
引用:原帖由 "czw1413_cn"]建议楼主在发表主题的时候不要使用“原创“ 发表:
呵呵,打击别人的积极性呢
不过方法真的不错,比我的好多了:
1、发现锁表(以tea为例)。
2、在systables中找出tea对应的partnum。
3、用计算器将此数转换成十六进制。
4、用onstat -k|grep [十六进制] 找到相应的锁,并记录相对应的owner号,此owner号表示进行此操作的用户进程。
5、用onstat -u|grep [owner号] 找到相应的用户进程。
6、如果想看看到底是哪个语句产生的锁,用:onstat -g ses [owner号] 查看语句。或者用onmode -z [owner号]杀之。
cruelsun 回复于:2004-02-11 19:50:56
to 版主:
对不起,下次不敢了。呵呵 ~
to amiescort :
我以前的做法跟你说的差不多,前天查了官方文档,发现了这个系统表,一试才知道有这种用法。
to chenjiakai :
谢谢提醒,ISA以前也用过,还不知道有这个功能呢。
czw1413_cn 回复于:2004-02-11 21:11:13
to amiescort:
这绝不是打击,只是觉得没有必要
问题在标题里说明白就可以了
to all:
希望大家多发帖子,大家互相帮助,互相学习
bigsunflower 回复于:2004-03-22 13:10:43
DATABASE sysmaster;
SELECT owner FROM syslocks WHERE tabname="表名";
好像并不管用,syslocks中的tabname 对应的名字都为sysdatabases
而不是对应的表名阿
??
volcanosh 回复于:2004-03-22 13:31:22
是不是能编个脚本?那样就方便多了
|