文档库 最新最全的文档下载
当前位置:文档库 › 关于Informix锁表的问题

关于Informix锁表的问题

1.在将一个表unload时,出现:
244:Could not do a physical-order read to fetch next row
107:ISAM error:record is locked
在不重启动数据库情况下,如何解锁?

onstat -g ses和onstat -g sql可以通过SQL语句检查那些用户,那些SQL在操作这张表。
可以重点检查onstat -g sql中UPDATE,DELTE,INSERT语句。

onstat -k看锁的情况,通过输出的tblsnum一列检查是否这张表被锁了。
tblsnum可以通过下面的SQL去获得
select tabname,hex(partnum) from systables where tabname="tabname"

这个是我经常用得看谁锁表得小脚本,后面可以再加上onstat -g 得选项。看具体执行了什么东西。
代码:

onstat -k|grep X|awk '{print $3}'|sort -u >tmp1.txt
cat tmp1.txt|while read line
do
onstat -u|grep $line
done
rm tmp1.txt

2.近期我在对INFORMIX数据库的表进行UPDATE时,总也报-244的错误,我已经在配置文件中加大的锁的个数,
但还是不行,不知-244的错误还与什么有关系?

请查看该表的锁级别,有page,row之分

SQL code只能说明操作上的故障,最终要看ISAM错误代码。
只要索引没问题的前提下,估计是锁并发性的问题,而不是锁不够的问题。
可能通过走索引的方式去尽量避免。

3.在Informix里如果应用将某个表锁住了,如何查出是那个进程锁住的,又如何释放?

1、发现锁表(以tab_test为例)。
2、在systables中找出tab_test对应的partnum。
3、用计算器将此数转换成十六进制。
4、用onstat -k|grep [十六进制] 找到相应的锁,并记录相对应的owner号,此owner号表示进行此操作的用户进程,找到rowid为0的记录(如果有的话)。
5、用onstat -u|grep [owner号] 找到相应的用户进程。
6、如果想看看到底是哪个语句产生的锁,用:onstat -g ses [owner号] 查看语句。或者用onmode -z [owner号]杀之。


谢谢楼上的,解决了我找了很久的问题。不过最后一点是session id


4.如果您执行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 命令杀断该会话。


不过方法真的不错,比我的好多了:
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号]杀之。



5.我有一个表,再用ISQL查询时,提示记录被锁定,查不出任可内容,用unlock table 表名,又提示我表未被我锁定。
确认为表中的某一记录被锁定了。在不重启数据库和表数据情况下,怎样解锁。

记录应该是被其他进程的数据库访问锁住了,
只能找出源头,释放锁才行。

解锁步骤:
1、发现锁表(以tpm_radio_bts为例)。
2、在systables中找出tpm_radio_bts对应的partnum。
3、用计算器将此数转换成十六进制。
4、用onstat -k|grep [十六进制] 找到相应的锁,并记录相对应的owner号,此owner号表示进行此操作的用户进程。
5、用onstat -u|grep [owner号] 找到相应的用户进程。
6、如果想看看到底是哪个语句产生的锁,用:onstat -g ses [owner号] 查看语句。或者用onmode -z [owner号]杀之。


6.怎样查看数据库现在用的是什么锁?怎样设置informix的锁? 我现在要把一个表从页级锁改为记录琐该怎么办啊?
1、看表的锁级别
(1)oncheck -pt database_name:table_name
(2)select tabname, locklevel from systables where ...
2、设置锁级别
alter table t_test lock mode (ROW)

相关文档
相关文档 最新文档