更新任务中的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条回答
CJones
1楼-- · 2020-09-13 16:24

我只能 猜猜这可能与数据库提交有关。 虽然不确定我是否了解多重锁定情况。 标准SO更新事务(VA02)通过文档编号将锁定应用于整个销售订单。 如果我要为该文档更新Z表#我也将以相同的方式锁定。 为什么要拥有/需要多个锁?

我建议添加更多详细信息和代码示例。

Haoba3210
2楼-- · 2020-09-13 16:26

这听起来可能是事实。 我将调查您提供的建议。 非常感谢。

关于作业专用键。 关于为什么尝试使用包含我锁定的键的where子句删除时为​​什么会出现死锁的想法? 即 会话1的订单#1锁定,会话2的订单#2锁定,然后执行Delete ztable,其中order = 2且键= blah1和key = blah2 ...等。

删除操作将永远不会完成,最终会因死锁而导致转储失败。

Tong__Ming
3楼-- · 2020-09-13 16:26

我将添加一些伪代码。 请注意,这太简单了。

在运行此程序进行测试时,我将40个订单的更新任务称为测试报告中的40次。 然后针对不同订单从另一个会话再次开始报告,并显示进度更新,向我显示已处理了多少订单。 第一份报告将在第二份报告开始处理之前处理所有40个问题,而我希望第二份报告能抓住两者之间的锁定,并同时进行处理。 希望这有助于澄清上面的一些问题。

在调试器中运行时,第二个会话将抓住锁,但将保留delete语句,就好像表仍被锁定到第一个会话,在运行出队后仍然具有它。

"此函数在销售订单保存中启动的更新任务中的数据集循环中调用

 功能zupdate
   做5次。
     通话功能'ENQUEUE_EZNO_SLSINC_ORD'
       出口
         mode_zno_slsinc_order ='E'"表ZNO_SLSINC_ORDER的锁定模式
         mandt = SY-MANDT"第01个入队参数
         order_number ='0000000001'"第08个入队参数
         _wait ='X'
 ** _collect =''"最初仅收集锁
       例外情况
         foreign_lock = 1
         system_failure = 2
         其他= 3
       。
     如果sy-subrc = 0。
       出口。
     万一。
   ENDDO。
   如果sy-subrc <> 0。
     出口。
   万一。

   在条件" ..."中删除zno_slsinc_order。
   进行处理以获取新的订单数据
   从wa_zno_slsinc_order插入zno_slsinc_order。

   通话功能'DEQUEUE_EZNO_SLSINC_ORD'
   出口
     mode_zno_slsinc_order ='E'"表ZNO_SLSINC_ORDER的锁定模式
     mandt = SY-MANDT"第01个入队参数
     order_number ='0000000001'"第08个入队参数
   。

 结束功能。
  

 
野沐沐
4楼-- · 2020-09-13 16:22

我最初尝试按文档编号进行锁定,但是在测试中,我的delete语句看起来像是在那种情况下条件(尽管它们只是在锁定的文档#上删除)的条件导致了死锁

一周热门 更多>

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

相关问答