Ibm midrange iSeries-按相同作业/会话记录锁定

Ibm midrange iSeries-按相同作业/会话记录锁定,ibm-midrange,rpg,Ibm Midrange,Rpg,我在下面的场景中遇到问题 程序a中的文件MYFILE上有一个记录锁。稍后会话突然断开,MYFILE上有一个记录锁,并执行取消处理程序例程。在cancel handler程序例程(程序B)中,它尝试删除MYFILE中锁定的记录,会话挂起,因为文件MYFILE是使用NOMAX的WAITRCD时间编译的。现在,没有人可以从其他会话访问帐户进行任何更新操作 程序流程如下所示: 。。。。 .... 程序A(记录锁) .... 程序X(取消处理程序)->添加了OVRDBF WAITRCD(3) .... 程

我在下面的场景中遇到问题

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

程序流程如下所示:

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

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

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

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

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

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

假设这不是一个选项


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

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

假设这不是一个选项


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

不要使用WAITRCD=*NOMAX编译文件。如果作业需要等待锁定,请使用OVRDBF调整等待时间。我猜你在等待是因为有批处理作业在交互作业上等待,而超时是因为有人在他们的桌面上打开了一个记录。交互程序不应锁定记录,直到它准备好进行更新。这将首先防止这个问题

不要使用WAITRCD=*NOMAX编译文件。如果作业需要等待锁定,请使用OVRDBF调整等待时间。我猜你在等待是因为有批处理作业在交互作业上等待,而超时是因为有人在他们的桌面上打开了一个记录。交互程序不应锁定记录,直到它准备好进行更新。这将首先防止这个问题

…使用NOMAX的WAITRCD时间编译
——为什么?是否需要*NOMAX?如果不是,为什么不改变它呢?意识到我在帮助延续一个错误的想法,我将添加一条评论,说WAITRCD()与锁没有关系。它只帮助限制对锁作出反应所需的时间。WAITRCD()过期后,锁将继续保持不变。WAITRCD唯一能做的就是防止其他作业被卡在记录锁后面。要清除记录锁定,您需要取消作业。
…使用NOMAX的WAITRCD时间编译。
--为什么?是否需要*NOMAX?如果不是,为什么不改变它呢?意识到我在帮助延续一个错误的想法,我将添加一条评论,说WAITRCD()与锁没有关系。它只帮助限制对锁作出反应所需的时间。WAITRCD()过期后,锁将继续保持不变。WAITRCD唯一能做的就是防止其他作业被卡在记录锁后面。要清除记录锁定,您需要取消作业。