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

2020-09-13 16:08发布

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

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


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

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

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

谢谢!

-克里斯

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

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


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

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

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

谢谢!

-克里斯

付费偷看设置
发送
10条回答
愤怒的猪头君
1楼-- · 2020-09-13 16:35

共享锁是什么意思? 如果它被锁定并且您想再次锁定它,通常您会得到sy-subrc 4。

如果您要在更新任务中调用函数,那么您有不同的应用服务器可能会很重要。 但是,如果您有多个任务正在运行并且它们并行运行,则可能会出现问题,将双端队列填充到其他应用服务器需要花费时间。 因此,当程序到达编码点时,另一个应用服务器仍然认为它已被锁定。

我读到正常的行为是第二​​个任务等待直到锁被释放(在enque中使用wait语句时)。

致谢

Stefan

四川大学会员
2楼-- · 2020-09-13 16:41

您要按行级别还是整个表锁定表?

宇峰Kouji
3楼-- · 2020-09-13 16:41

嗨,

在LUW上检查SAP帮助以获取有关数据库更新如何工作的信息

https://help.sap.com/saphelp_nw73ehp1/ helpdata/zh-CN/41/7af4bfa79e11d1950f0000e82de14a/frameset.htm

亲切的问候,Rob Dielemans

d56caomao
4楼-- · 2020-09-13 16:36

整个表,我想按顺序#进行操作,但是在带where条件的delete语句上遇到了死锁(我将order#锁定为where子句的一部分,所以我 不确定为什么会因此而死锁。)

spaceman01
5楼-- · 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秒,您将看到第一次运行获得了两个锁。

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

SAP砖家
6楼-- · 2020-09-13 16:39

我一定会仔细阅读此书,谢谢。

一周热门 更多>

点击此处---> EasySAP.com 一起学习S4 HANA ...

相关问答