0

我在以下情况下遇到问题。

来自程序 A 的文件 MYFILE 上有一个记录锁。稍后 Session 突然断开连接,并在 MYFILE 上设置一个记录锁,并执行取消处理程序例程。在取消处理程序例程(程序 B)中,它尝试删除锁定在 MYFILE 中的记录,并且会话挂起,因为文件 MYFILE 是用 NOMAX 的 WAITRCD 时间编译的。现在没有人可以访问该帐户以执行其他会话的任何更新操作。

程序流程如下:

.... .... 程序 A(记录锁定) .... 程序 X(取消处理程序)->OVRDBF WAITRCD(3) 添加 .... 程序 B(会话冻结)->在上面添加 OVRDBF 后,会话没有冻结程序 C(发生会话冻结)-> 我仍然看到覆盖在那里,它是相同的默认激活组,没有承诺控制,也没有触发器

这里的场景是:由同一个作业/会话记录锁定。

我尝试了以下解决方案来解决此问题:

在取消处理程序(程序 B)中,我做了一个 OVRDBF,WAITRCD 为 3 到 5 秒。后来执行了上面的步骤,到了取消处理程序的时候,累死了删除锁定的记录,3到5秒后,它继续处理下一步,并写了锁定记录的错误消息。没有屏幕冻结。后来它继续执行另一个程序 C,它试图删除 MYFILE 中的锁定记录。但是现在会话再次挂起。

我检查了调用堆栈,所有程序都在默认激活组下,没有提交控制,也没有触发器。任何想法,为什么它克服了程序 B 而不是程序 C 的记录锁定情况。请告诉我。

问候, 苏瑞

4

2 回答 2

3

处理这个问题的正确方法是让程序 A 使用承诺控制。然后回滚将是自动的,或者取消处理程序可以触发回滚。

假设这不是一个选择。

让您的取消处理程序提交一个延迟几秒钟的作业(给取消处理程序/原始作业时间结束),然后删除记录。

于 2014-12-18T14:03:51.143 回答
1

不要使用 WAITRCD = *NOMAX 编译文件。如果作业需要等待锁,请使用 OVRDBF 调整等待时间。我猜您正在等待,因为有批处理作业在等待交互式作业并且超时,因为有人在他们的桌面上保持记录打开。在准备好更新记录之前,交互式程序不应锁定记录。这将首先防止这个问题。

于 2014-12-19T03:01:16.797 回答