【转】关于ABAP中锁参数SCOPE的使用bug一粒 |
您所在的位置:网站首页 › range和scope的用法 › 【转】关于ABAP中锁参数SCOPE的使用bug一粒 |
版权声明:本文为CSDN博主「刘欣的博客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/ot512csdn/article/details/120761940 场景: LES系统每天会把现场投入5个车间的生产物料,传给SAP系统。SAP系统收到这些投料数据后,会有程序批量的把它们投料到生产工单上,完成物料在SAP系统中的消耗。 最初在1000工厂,我们开展的整车业务,随后,在1010工厂,我们开展了自制件业务。把整车业务的投料程序拷贝了一份,并对订单类型做了限制,就成了自制件业务的投料程序。 因为这个程序会有几个业务部门的人员同时操作,而每一次批量操作时,调用系统BAPI(系统标准功能)消耗物料(投料)的程序执行有几分钟才能处理完成。为了防止这个程序同时多次去读取了同一份LES的投料数据,然后在SAP系统中重复投料。所以我们给这个程序加了锁。 症状: 在自制件业务的物料投料凭证看,有很多重复投料产生,即一份LES的数据,在SAP系统中被执行了2次,产生了2个物料凭证。从最近的几次重复投料物料凭证时间看,间隔时间大概是2分钟。 即用户1对A物料产生投料凭证,2分钟后用户2又对A物料产生了投料凭证。 原因: 投料程序的逻辑如下: 1、读取LES数据,显示给用户 2、按用户的选择,处理投料数据,先把寄售数据转自有 3、再把物料按订单投料,完成物料消耗 我们在第1步程序中,加锁: 但程序在第2步中,锁被释放掉了,这并不是我们想要的,因为第3步才是长耗时程序,我们加锁是需要这把锁可以在1、2、3步都锁住数据。经过调试,我们发现在第2步调用系统做411K寄售转自有的BAPI后,锁被释放掉了。 解决: 因为使用了标准的锁功能及函数,默认的SCOPE参数中是给的是2,就是出现上面的问题,当我们使用SCOPE = 1时,这把锁可以锁住数据,在1、2、3程序真正执行完成后才解锁。金圣俊的书上对V1、V2更新及锁也有专门的章节讲解,但其实还是没有讲得很清楚。 目前我能够理解的就是SCOPE = 1是V1锁,是程序层面的锁,程序层面的锁,是整个程序结束后才释放;而SCOPE = 2是V2锁,是针对更新事件的锁。,更新层面的锁是程序中有数据库更新发生后就释放。 --------2022.1.17 后记---------------- 今天有时间测试了一下锁的_SCOPE参数,可以总结一下,_SCOPE 遭遇到如下物料BAPI, BAPI_GOODSMVT_CREATE,BAPI_TRANSACTION_COMMIT的情况如下: 一、SE11创建的对象锁: 如果 _SCOPE = 1,锁不会被释放。 如果 _SCOPE = 2,锁在物料BAPI执行后会自动释放。 二、程序锁 ENQUEUE_ES_PROG: 如果 _SCOPE = 1,锁不会被释放。 如果 _SCOPE = 2,锁在物料BAPI执行后会自动释放。 三、关于说明的翻译: _SCOPE Controls how the lock is passed to the update program: Value Meaning 1 The lock is not passed to the update program. The lock is removed when the transaction ends. 2 (default) The lock is passed to the update program. The update program is responsible for removing the lock. 3 The lock is passed to the update program. The lock must be removed in both the interactive(交互) program and in the update program. _SCOPE控制锁范围的传递: 1、当为1时,锁不能传给更新程序。锁会在程序结束后才移除。 2、当为2时,锁被传递给了更新程序,更新程序会负责移除锁。(有可能移除锁,也有可能不移除锁) ———————————————— 版权声明:本文为CSDN博主「刘欣的博客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/ot512csdn/article/details/120761940四、测试程序如下,不好找,所以放这里吧: REPORT ZJAMES_LOCK. CALL FUNCTION 'ENQUEUE_ES_PROG' EXPORTING MODE_TRDIR = 'E' NAME = 'ZJAMES_LOCK' X_NAME = ' ' _SCOPE = '2' _WAIT = ' ' _COLLECT = ' ' EXCEPTIONS FOREIGN_LOCK = 1 SYSTEM_FAILURE = 2 OTHERS = 3 . IF SY-SUBRC 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. DATA:lit_return LIKE STANDARD TABLE OF bapiret2, "bapi return lwa_return TYPE bapiret2, "bapi return lit_movs LIKE STANDARD TABLE OF bapi2017_gm_item_create, "mat doc item lwa_movs TYPE bapi2017_gm_item_create, "mat doc item lwa_header LIKE bapi2017_gm_head_01, "mat doc hdr lwa_code LIKE bapi2017_gm_code, "mmim code lwa_header_ret TYPE bapi2017_gm_head_ret. "mat hdr return lwa_code = '04'. "MB1B lwa_header-pr_uname = sy-uname. lwa_header-pstng_date = sy-datum. lwa_header-doc_date = sy-datum. REFRESH:lit_movs. CLEAR:lwa_movs. lwa_movs-material = '000000000050580071'. lwa_movs-plant = '8800'. lwa_movs-stge_loc = '8813'. lwa_movs-move_type = '311'. lwa_movs-stck_type = ''. lwa_movs-move_stloc = '8814'. lwa_movs-spec_stock = 'E'. lwa_movs-val_sales_ord = '0640003056' . lwa_movs-val_s_ord_item = '000200'. lwa_movs-entry_qnt = 1. CLEAR:lwa_movs-entry_uom. APPEND lwa_movs TO lit_movs. CALL FUNCTION 'BAPI_GOODSMVT_CREATE' EXPORTING goodsmvt_header = lwa_header goodsmvt_code = lwa_code TABLES goodsmvt_item = lit_movs[] return = lit_return[]. LOOP AT lit_return INTO lwa_return WHERE type = 'E' OR type = 'A' OR type = 'X'. write:/ lwa_return-type && ': ' && lwa_return-MESSAGE. ENDLOOP. IF sy-subrc = 0. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. ELSE. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = 'X'. ENDIF. ———————————————— 版权声明:本文为CSDN博主「刘欣的博客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/ot512csdn/article/details/120761940五、关于对象锁和程序锁的功能 1、程序锁: 比较好理解,程序开始加一把锁,程序结束后,这把锁自动释放。 2、对象锁: 我们想对更细的数据加锁,比如细到某表中的一行数据,我们可以在SE11中按表的关键字建一个锁对象,然后我们使用这个对象锁时,传入一行主键数据;那么这一行数据就有了锁,如果其它程序也有这个锁对象,也传入了相同的主键,就可以知道前面已经有锁了。 如下面EZ_JAMES_OBJECT这个锁对象,它的主键是GUID,我们对A10001236这行数据加锁。 CALL FUNCTION 'ENQUEUE_EZ_JAMES_OBJECT' EXPORTING MODE_ZESBTEST = 'X' MANDT = SY-MANDT GUID = 'A10001236' X_AUTONUMBER = ' ' X_GUID = ' ' _SCOPE = '2' ———————————————— 版权声明:本文为CSDN博主「刘欣的博客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/ot512csdn/article/details/120761940推荐阅读: 《ABAP新语法1》 《ABAP新语法2》 《SM30添加按钮:批导,筛选,排序等完整demo 》 《关于 SM30/VIEW_MAINTENANCE_CALL锁整张表问题》 《Demo:弹出文本输入框》 《关于update task几个有意思的测试》 《动态批量修改任意表任意字段的值》 《动态获取查询条件的一个小Demo》 《使用cl_gui_docking_container 实现多ALV》 《VOFM 修改 组单开票时 会计凭拆分规则》 《DEMO SUBMIT 某程序并获取该程序ALV数据》 《DEMO:S/4 1809 FAGLL03H 增加字段增强》 《几个ABAP实用模板,体力活就别一行行敲了,复制粘贴得了》 《DEMO:BTE增强实现凭证创建检查》 《SAP Parallel Accounting(平行分类账业务)配置+操作手册+BAPI demo程序》 《CC02修改确认日期BAPI:Processing of change number was canceled》《我是怎样调试BAPI的,以F-02为例》 《女儿的部分书单》 《推荐几本小说吧,反正过年闲着也是闲着,看看呗》 《我是不是被代码给耽误了……不幸沦为一名程序员……》 《三亚自由行攻略(自己穷游总结)》 《苏州游记》 《记码农十周年(20110214--20210214)》 《不一样的SAP干货铺群:帅哥靓妹、红包、烤羊腿!》 《十年老码农搬砖习惯和技巧》 《我这个老码农是怎么debug标准程序的》 《我是怎样调试BAPI的,以F-02为例》 《杂谈:几种接口》 《干货来袭:2020年公众号内容汇总》 《Odata 增删改查详例》 《ODATA CREATE_DEEP_ENTITY 详例》 《RESTful DEMO 一:SAP 如何提供 RESTful Web 服务》 《RESTful DEMO 四 :增删改查及调用》 《DEMO search help 增强 ( vl03n KO03 等)》 《录BDC时 弹出的公司代码框问题》 《搜索帮助系列》 《增强相关》 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |