免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1715 | 回复: 0
打印 上一主题 下一主题

锁模式和锁等待 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-12-02 15:37 |只看该作者 |倒序浏览
两个常驻进程,A,B都需要不断的扫描数据库中的某张表T1,根据
其中不同的字段,判断进行不同的操作。

原程序流程:
A:
while( 1 ) {
    begin work;
    lock table T1 in exclusive mode;
    select ... from T1 where ...;
   dealing...
    update T1 set .... where ....
    commit/rollback;
    sleep
}

B:
while( 1 ) {
    begin work;
    set lock mode to wait 120;
    select ... from T1 where C1 = ...;
    dealing...
    update T1 set ... where C1 = ...;
    set lock mode to no wati;
    commit/rollback;
    sleep
}

在9版以后的数据库中,两个进程相安无事,运行了近两年的时间,基本无错。

日前做另一个项目,客户方的数据库是远程数据库D1(版本7.31),开发和测试使用的本地数据库D2(版本9.30)。

测试过程中一切顺利,而且是成功案例的推广,我也没有过多的测试,在上线前
只在远程数据库上测了测功能(也发现了一些版本差异引起的问题,小改后搞定),谁知上线后B进程每天提示244/113的错,非常郁闷。
尝试解决过程:
根据:A进程以独占模式锁表后,B进程对T1表的访问不能按物理顺序访问,必须通过索引准确定位。
调整:B进程对T1表的访问本是通过索引的方式(不是唯一索引),调整为唯一索引。
结果:不报244的错,开始报245/144的错。

因此怀疑是数据库引擎的版本问题:9版上开发的应用,远程访问7版的数据库时,发生了某个未知的错误,最大的可能是锁等待模式设置的语句没有生效,对此再次做尝试:
1、对本地数据库D2(informix 9.30)做以下操作:
终端x:用dbaccess执行:begin work; lock table T1 in exclusive mode;
终端y:用dbaccess执行:select * from T1 where ...;
       提示 244/113,与想象中差不多。
       再执行set lock mode to wait 30; select * from T1 where ...;
       提示锁等待模式已设置。
回到终端X: 执行commit work;
再回到终端y: select的结果顺利出炉,完全正确。
2、同样对远程数据库D1(Informix7.31)做同样的操作,结果在锁资源释放后,也能顺利查找到记录。

问题在哪里?
这个问题不急,我修改后应用后ok,但是我一直怀疑是Informix数据方面的原因,又找不到合理的答案,
至今郁闷中
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP