如何更换WAIT,以避免锁定错误并释放内存



我今天有一个关于WAIT使用的问题。 我与内部源代码质量团队合作,负责审查您的代码并批准它。不幸的是,现在禁止使用WAIT UP TO x SECONDS指令,也不可协商。

问题

CALL FUNCTION 'ANY_FUNCTION_WITH_LOCK'.
CALL FUNCTION 'ANY_FUNCTION_WITH_LOCK_2'.

如果我执行此伪代码,我将出现错误(锁定对象),因为我使用共享对象(我使用没有同步/异步模式的功能模块)。

我可以通过使用WAIT来解决此问题。

CALL FUNCTION 'ANY_FUNCTION_WITH_LOCK'.
WAIT UP TO 5 SECONDS. " or 1, 2, 3, 4, 5, ... seconds <------------
CALL FUNCTION 'ANY_FUNCTION_WITH_LOCK_2'.

使用此方法(和 std 函数),系统将停止并等待特定时间。 但是,有时系统需要 1 秒...或更多。我们无法知道所需的确切时间。

但是,如果我们在包含大量对象的循环中执行此代码,则系统可以无限等待,直到内存转储。

(受影响的功能与 VL32N、QA11 和 ...及其对象)

需要

需要是如何替换 WAIT 指令?我们需要找到一个与WAIT UP TO具有相同行为的解决方案/函数,但不会影响(或更少)内存级别(转储、过度消耗资源......

事实上,我们需要类似COMMIT WORK AND WAIT的东西,但结果是函数而不是数据库。

解决 方案?

  • 使用带有时间戳比较的循环并使用ENQUEUE_READ获取锁定对象的列表并检查所需的对象是否在此列表中,直到 X 秒。似乎此解决方案需要与WAIT相同级别的资源。

  • ENQUE_SLEEP似乎具有与内存上的 WAIT 相同的行为(如何使 abap 程序暂停?

  • 重构已完成的所有代码,并使用同步函数。

别的东西?知道吗?甚至可能吗?

提前致谢:)

为什么不检查两个功能模块之间的锁定? 您可以将其放入循环中,并在从 FM 1 中清除锁后立即退出循环。

当我想等待指定的时间然后重新检查某些内容时,我会使用ENQUE_SLEEP。 例如,您可以等待 5 秒钟,然后检查锁是否存在。 如果对象不再锁定,请继续。 如果锁还在,请再次睡觉。 为了避免无限循环,在放弃并记录某种错误之前,您必须对愿意睡觉的次数进行一些限制。

WAIT 的问题在于它会触发隐式提交。 ENQUE_SLEEP不会那样做。

最新更新