更新任务中的ABAP Z表锁垄断了锁

2020-09-13 16:08发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)在保存销售订单时,我正在调用更新...

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


在保存销售订单时,我正在调用更新任务来更新Z表。 我正在遍历一些标准SAP记录,然后在每次迭代中使用wait参数使Z表入队,并删除记录/添加新记录,然后最终出队。

我发现的是,当多个更新任务正在运行时,第一个更新任务将一遍又一遍地锁定和解锁表,直到它处理完所有记录为止,第二个更新任务才能获得该锁。 这实际上使第二个更新任务一直等到第一个更新任务完成,因为我希望他们在第一个任务释放它时共享锁。

有人可以为我指出要检查/更新的内容的正确方向,以使此事情发生。 我最初曾尝试完善lock参数,但由于某些修改/删除where子句而继续陷入死锁,除非我锁定了整个表。

谢谢!

-克里斯

10条回答
spaceman01
2020-09-13 16:30

据我所知,您期望一种锁定队列和所有入队请求将按调用顺序被授予。

这不是它的工作方式,请参阅doco中的WAIT参数: https://help.sap.com/viewer/ec1c9c8191b74de98feb94001a95dd76/7.5.12/zh-CN/cf21eebf446011d189700000e8322d00.html

如果由于存在竞争的锁定而导致锁定尝试失败,则系统将在一定时间后重复锁定尝试。 仅在自首次锁定尝试以来经过一定的时间限制后,才会触发FOREIGN_LOCK异常。 等待时间和时间限制由配置文件参数定义。

因此,您的解锁-锁定周期太快,以至于另一个程序在解锁后的短暂时间内无法重试。

您可以使用一个简单的程序来验证此行为:

报告zlock_test。

 调用函数'ENQUEUE_EDEMOFLHT'导出_wait = abap_true。
 等待最多10秒。
 调用函数" DEQUEUE_EDEMOFLHT"。

 调用函数" ENQUEUE_EDEMOFLHT"。
 如果sy-subrc = 0。
   写:'得到第二把锁'。
 万一。
 

在两个会话之间运行,彼此之间的间隔不到10秒,您将看到第一次运行获得了两个锁。

我的建议是一次性收集您的更新并进行处理。 或用特定于工作的钥匙(例如公司代码或其他任何东西)锁定。

一周热门 更多>

相关问答