点击此处---> 群内免费提供SAP练习系统(在群公告中)
加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)
在保存销售订单时,我正在调用更新任务来更新Z表。 我正在遍历一些标准SAP记录,然后在每次迭代中使用wait参数使Z表入队,并删除记录/添加新记录,然后最终出队。
我发现的是,当多个更新任务正在运行时,第一个更新任务将一遍又一遍地锁定和解锁表,直到它处理完所有记录为止,第二个更新任务才能获得该锁。 这实际上使第二个更新任务一直等到第一个更新任务完成,因为我希望他们在第一个任务释放它时共享锁。
有人可以为我指出要检查/更新的内容的正确方向,以使此事情发生。 我最初曾尝试完善lock参数,但由于某些修改/删除where子句而继续陷入死锁,除非我锁定了整个表。
谢谢!
-克里斯
共享锁是什么意思? 如果它被锁定并且您想再次锁定它,通常您会得到sy-subrc 4。
如果您要在更新任务中调用函数,那么您有不同的应用服务器可能会很重要。 但是,如果您有多个任务正在运行并且它们并行运行,则可能会出现问题,将双端队列填充到其他应用服务器需要花费时间。 因此,当程序到达编码点时,另一个应用服务器仍然认为它已被锁定。
我读到正常的行为是第二个任务等待直到锁被释放(在enque中使用wait语句时)。
致谢
Stefan
您要按行级别还是整个表锁定表?
嗨,
在LUW上检查SAP帮助以获取有关数据库更新如何工作的信息
https://help.sap.com/saphelp_nw73ehp1/ helpdata/zh-CN/41/7af4bfa79e11d1950f0000e82de14a/frameset.htm
亲切的问候,Rob Dielemans
整个表,我想按顺序#进行操作,但是在带where条件的delete语句上遇到了死锁(我将order#锁定为where子句的一部分,所以我 不确定为什么会因此而死锁。)
据我所知,您期望一种锁定队列和所有入队请求将按调用顺序被授予。
这不是它的工作方式,请参阅doco中的WAIT参数: https://help.sap.com/viewer/ec1c9c8191b74de98feb94001a95dd76/7.5.12/zh-CN/cf21eebf446011d189700000e8322d00.html
如果由于存在竞争的锁定而导致锁定尝试失败,则系统将在一定时间后重复锁定尝试。 仅在自首次锁定尝试以来经过一定的时间限制后,才会触发FOREIGN_LOCK异常。 等待时间和时间限制由配置文件参数定义。
因此,您的解锁-锁定周期太快,以至于另一个程序在解锁后的短暂时间内无法重试。
您可以使用一个简单的程序来验证此行为:
在两个会话之间运行,彼此之间的间隔不到10秒,您将看到第一次运行获得了两个锁。
我的建议是一次性收集您的更新并进行处理。 或用特定于工作的钥匙(例如公司代码或其他任何东西)锁定。
我一定会仔细阅读此书,谢谢。
一周热门 更多>