我在下面的情况下遇到了麻烦。
来自程序A的文件MYFILE上有一个记录锁。后来会话突然断开,MYFILE上有一个记录锁,它执行取消处理程序例程。在取消处理程序程序例程(程序B)中,它尝试删除在MYFILE中锁定的记录并且会话挂起,因为文件MYFILE是使用NOMAX的WAITRCD时间编译的。现在,没有人可以访问该帐户以获取其他会话的任何更新操作。
计划流程如下:
.... .... 程序A(记录锁定) .... 程序X(取消处理程序) - > OVRDBF WAITRCD(3)添加 .... 程序B(会话冻结) - >在上面添加OVRDBF后,会话没有冻结 程序C(会话冻结发生) - >我仍然看到覆盖是存在的,它是相同的默认激活组,没有承诺控制和没有触发器
此处的场景是:通过相同的作业/会话记录锁定。
我尝试过以下解决方案来解决问题:
在取消处理程序(程序B)中,我做了一个OVRDBF,WAITRCD为3到5秒。稍后执行上面的步骤,当它取消处理程序时,它累了删除锁定的记录,并在3到5秒后,继续处理后续步骤并写入锁定记录的错误消息。没有屏幕冻结。后来它继续执行另一个程序C,它试图删除MYFILE中的锁定记录。但现在会议再次挂起。
我检查了调用堆栈,所有程序都在Default激活组下,没有committment控件,也没有触发器。任何想法,为什么它克服了程序B而不是程序C的记录锁定情况。请让我知道。
此致 苏瑞
答案 0 :(得分:3)
处理此问题的正确方法是让程序A使用承诺控制。然后回滚将是自动的,或者取消处理程序可以触发回滚。
假设不是一种选择。
让您的取消处理程序提交延迟几秒钟的作业(给予取消处理程序/原始作业时间结束),然后删除记录。
答案 1 :(得分:1)
不要使用WAITRCD = * NOMAX编译文件。如果作业需要等待锁定,请使用OVRDBF调整等待时间。我猜你正在等待,因为有批处理作业在等待交互式作业并超时,因为有人在桌面上打开记录。在准备好更新记录之前,交互式程序不应锁定记录。这将首先防止这个问题。