- 论坛徽章:
- 0
|
各位大虾,本人刚开始研究INFORMIX不久,对其锁问题不太熟悉。
在我的一个应用中,根据A表的对应关系,来UPDATE B表中的数据;
大体代码如下:
set isolation to dirty read;
set lock mode to wait 30;
EXEC SQL declare cur1 CUSOR for select col1,col2 into :a,:b from A;
EXEC SQL open cur1;
EXEC SQL fetch cur1;
EXEC SQL UPDATE B SET cola=:a where colb=:b;
基本上就如上代码:
在执行后,一直都在wait 30状态,
也没报什么错;
然后我就将set lock mode to wait 30;改成set lock mod to not wait;
从新执行,运行 onstat -g sql
看到还是正常的, ISO状态 DR, not wait;
也没报什么错;
但就是一直没运行出来;
B表的数据是有点大 有1K万条数据;A表只有6K的数据量,按照以前的经验只要最多1个多小时就跑出来;
我就怀疑出现死锁;
就 dbaccess sysmaster; 查 select * from syslocks where tabname="B"
返回两条记录
发现同一个表,同一OWNER,比如31422,对应两个锁,一个类型为U(更新锁),一个类IX(意图独占锁)
但是从syssesprof和sysptprof表中,B表对应死锁个数为0,其对应的SID死锁个数也为0;
现在我就有几个问题;
为什么同一个表会对应两个锁,而这两个锁又分别是对应的同一个会话;其实都是我的应用产生的;
第二个问题
在我的 set lock mode to wait 30的情况下;
在没有其他应用操作或查询B表的情况下,为什么在运行onstat -g sql 该表对应的状态总是 set lock mode to wait 30;这种状态就说明有其他用户在锁表,但是就没有这种情况啊。
第三个问题
这是一个锁溢出问题吗?什么是锁溢出?
谢谢各位了。小弟实在是才学蔬浅;
我的QQ 4198585
希望大家能帮助解决这个问题; |
|