ABAP调用BAPI时COMMIT WORK AND WAIT未按照预期同步提交问题分析

news2024/11/14 15:26:24

背景:

在做ABAP开发时,经常会有连续调用BAPI的需求,比如先创建销售订单,再依据销售订单创建交货单,再对交货单进行过账等类似的一连串调用,这种类似的场景往往需要前一步操作的数据完全写入数据库才能进行一下个步骤,但是数据写入底表是需要时间的,如果一些业务数据比较复杂,可能在调用下一个BAPI时会因为数据尚未写入底表而导致BAPI报出单据不存在等类似的错误消息(如果BAPI是以异步提交方式处理),这时候不同的开发者会往往有不同的处理方式,比如WAIT UP TO XXX SECONDS之类的操作,但并不推荐这么去做,因为往往会浪费一些不必要的时间,本文将结合笔者自身经验来分析这个问题,提供一些不同的解决方式,根据实际情况进行选择。


BAPI的执行原理:

大部分BAPI执行的大概过程如下:

:报表程序中调用BAPI;

②③④:BAPI内部经过一系列检查处理后,将需要更新提交的数据统一注册到更新进程LUW中;

如果BAPI本身比较规范的话,一般会有类似COMMIT_WORK以及COMMIT_WORK_AND_WAIT等类似的传入参数,那么我们最好是通过参数使其内部以同步方式提交,或者使其内部不要提交,由调用者来决定是否已同步方式提交(AND WAIT附加项决定了更新进程是否以同步模式提交);

在碰到COMMIT WORK语句后,之前注册的所有更新函数将按照顺序依次执行⑦⑧⑨⑩,并且BAPI中产生的锁会一并带到更新进程中,优先执行V1更新,V1更新执行完毕后,数据库进行提交,并且释放所有的锁,V2进程不会再有加锁的操作,V2执行完毕后,整个数据库提交过程完毕,如果更新进程中出错,则会自动触发回滚,并收到一条Dump快件;

如果是以同步提交(COMMIT WORK AND WAIT)触发更新,则程序会在更新进程执行完毕后才返回至调用程序,如果是以异步方式(COMMIT WORK)触发更新,则程序不会等待更新进程执行完毕,立即进行后续处理,这种时候如果要对该BAPI产生的单据进行下一步处理,则可能会出现单据不存在,或者锁定报错;

某些BAPI中的更新进程中甚至会有上图中的处理流程,将一部分数据处理用IN BACKGROUD TASK的方式去触发异步事务性函数(tRFC)处理,尽管这种方式已被SAP标记为过时的方式,但是仍然有一些BAPI中采用了这种方式,比如报工BAPI:BAPI_PRODORDCONF_CREATE_TT,其中针对于货物移动的处理就是采用的这种方式,使用IN BACKGROUND TASK触发的事务会立即以异步方式在独立进程中执行,所以AND WAIT不会对其生效。


更新进程的处理流程:

官方说明:

After the transaction closes, the dialog work process closes the VBHDR entry (the beginning of the update for the update request), and searches for an update server for the U1 update. This described in more detail in Update Dispatching with Load-Balancing.

The update server distributes the tasks to an update work process. This processes the V1 modules of the update request, triggers a COMMIT to the database, and releases the R/3 locks on the update request (see The SAP Lock Concept). Then the work process searches for an update server for the U2 update, if the U2 update modules exist.

These are forwarded from a U2 update server to a U2 work process that processes the U2 modules, and triggers a COMMIT on the database.

The following graphic displays this process from the view of various work processes. It also displays the time at which changes to the database are made.

官方说明:

The U1 modules are processed by transmitting the contents of the update table VBMOD and VBDATA to the application tables of the database. The changes are actually in the desired tables in the database only at the end of the database LUW in which it occurs. The SAP locks are released and, if V2 update modules exist, the V2 update is started. This is similar to the V1 update with the exception that there are no locks that have to released and no search for a process for further processing.

需要注意的是,V1更新是可选同步更新或者异步更新,根据附加项AND WAIT来决定,V2更新则永远是异步更新,COMMIT WORK AND WAIT也只会等待V1更新完毕。 


COMMIT WORK AND WAIT不生效的原因:

知道了BAPI以及更新进程的原理,那同步提交不生效的原因就变得清晰了,大概有以下几种情况:

  • BAPI没有NO_COMMIT以及COMMIT_WORK_AND_WAIT等类似的参数,直接在内部执行了COMMIT WORK语句(没有附加AND WAIT),因为内部的COMMIT WORK已经触发了更新进程的处理,所以调用程序中的COMMIT WORK AND WAIT将没有东西可触发,所以会不生效,类似的BAPI有BAPI_MATERIAL_SAVEDATA,BAPI_ENTRYSHEET_CREATE 和 BAPI_PO_RESET_RELEASE等。
  • BAPI本身提供了NO_COMMIT参数,但是调用时未传入该参数,导致BAPI内部仍然以异步方式进行了提交,故调用侧的同步提交不生效,类似的BAPI有BAPI_PO_RELEASE,CO_SE_PRODORD_OPR_CREATE等。
  • BAPI在更新进程中触发了新的异步远程更新进程,如报工BAPI:BAPI_PRODORDCONF_CREATE_TT,COMMIT WORK AND WAIT只会等到IN UPDATE TASK注册的更新进程处理完毕,并不会等待IN BACKGROUND TASK注册的更新进程。

标准BAPI事务模型规范:

BAPI 事务模型必须为用户提供明确的事务控制权。因此,如果同时调用多个 BAPI,则调用方可以自行决定何时执行 COMMIT WORK(或者,视情况而定,执行 ROLLBACK WORK)。这意味着 BAPI 本身不能(通常)执行 COMMIT WORK 命令。
以下限制适用于将多个 BAPI 合并到一个 LUW 中:

  • 如果实例是由写入 BAPI 创建、修改或删除的,则读取 BAPI 只有在发生 COMMIT WORK 时才能访问最新数据。
  • 不能在一个 LUW 中的同一实例上进行两次写入访问。例如,不能先在同一 LUW 中创建然后更改对象。但是,您可以在 LUW 中创建同一对象类型的多个实例。

尽管 SAP 提供的所有 BAPI 都应遵循此事务模型,但也有例外,并不是所有BAPI都会按照这个规范去操作,所以碰到这种情况,则需要按照实际情况去分析处理。


如何解决:

解决该问题的方式有很多种,其中最不推荐的则是WAIT UP TO XXX SECONDS的方式,尽管高版本中可以选择WAIT UP TO '0.1' SECONDS的方式,但对于一些强迫症开发者来说,多余浪费的0.01秒都是不能容忍的,所以可以有以下几种替代方式来处理异步提交问题。

1:分组处理

比如针对一批数据的每一条,都需要调用完创建BAPI之后再调用修改BAPI对其修改,则可以先统一进行创建处理,再进行修改处理,通常当所有单据创建完之后,最先创建的单据应该早已提交更新完毕,示例如下:

改造前:

...
LOOP AT objects.
  CALL FUNCTION 'BAPI_OBJECT_CREATE'.
  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
    IMPORTING
      WAIT = 'X'.
  CALL FUNCTION 'BAPI_OBJECT_CHANGE'.
  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
    IMPORTING
      WAIT = ' '.
  ENDIF.
ENDLOOP.

改造后:

...
LOOP AT objects.
  CALL FUNCTION 'BAPI_OBJECT_CREATE'.
  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
    IMPORTING
      WAIT = ' '.
ENDLOOP.
LOOP AT objects.
  IF object not exists.
    APPEND object TO object_work_list
  ELSE.
    CALL FUNCTION 'BAPI_OBJECT_CHANGE'.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      IMPORTING
        WAIT = ' '.
  ENDIF.
ENDLOOP.
Reprocess the objects in object_work_list and wait

2:SET UPDATE LOCAL TASK

SET UPDATE LOCAL TASK会忽略IN UPDATE TASK附加项,使BAPI中数据库更新的过程以本地更新的方式在当前会话内部单独执行,而非注册到VB更新进程中,并且COMMIT WORK会隐式的添加同步提交,但每次COMMIT WORK之后,本地更新会被禁用,所以需要的时候需要在每次调用BAPI之前执行SET UPDATE LOCAL TASK语句来开启本地更新,该方式适用于数据库提交函数中没有触发异步远程RFC的BAPI,例如BAPI_PRODORDCONF_CREATE_TT。


3:使用时间戳+WHILE

通过下面的代码,可以将等待时间减少到尽可能短的等待时间 ,具体取决于使用情况,从而不会浪费额外多余的时间。

DATA: BEGIN OF ls_time,
        start   TYPE timestampl,
        now     TYPE timestampl,
        elapsed TYPE tzntstmpl,         " 目前已运行时间
        limit   TYPE tzntstmpl VALUE 3, " 最大等待时间
      END OF ls_time.

GET TIME STAMP FIELD ls_time-start.

WHILE ls_time-elapsed < ls_time-limit.

      SELECT SINGLE * INTO @DATA(LS_XXX) FROM XXXX WHERE ...
 
      IF LS_XXX IS NOT INITIAL.
         EXIT.
      ENDIF.

  GET TIME STAMP FIELD ls_time-now.

  ls_time-elapsed = cl_abap_tstmp=>subtract(
    tstmp1 = ls_time-now
    tstmp2 = ls_time-start
  ).

ENDWHILE. " elapsed time

 4:使用模式为 U 或 V 的 ENQUEUE_XXXX 功能模块

当您使用适当的功能模块并使用模式 U、V(或 W)时,它将检查锁是否冲突。此处的 SAP 帮助示例:使用锁定模式 U、V 和 W - SAP 锁定概念 - SAP 库中对此进行了详细说明。这里没有提到的是 _WAIT 参数。将此参数设置为 (abap_true 或 'X') 将使函数调用等待预定时间以释放锁。美妙之处在于,这不仅适用于您设置锁定的标准模式,而且还适用于碰撞检查。

CALL FUNCTION 'ENQUEUE_EVVBAKE'
  EXPORTING
    mode_vbak      = 'V'              " Lock mode for table VBAK
    vbeln          = l_sales_order    " 02th enqueue argument
    _wait          = abap_true
  EXCEPTIONS
    foreign_lock   = 1
    system_failure = 2
    others         = 3.

这种方法的好处是无需手动实现等待逻辑。


5:增强

如果以上方式都不能满足需求,则可以考虑将BAPI复制出来,找到其中控制异步的逻辑,通过增强来添加同步提交控制参数,使得BAPI以同步方式提交,一个案例如下:SAP CO11N BAPI_PRODORDCONF_CREATE_TT连续报工异步更新导致COGI解决方案-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/DeveloperMrMeng/article/details/139811212?spm=1001.2014.3001.5501SAP 报工BAPI中的 UPDATA TASK 和 BACKGROUND TASK_abap in backround task 和in update task的区别-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/DeveloperMrMeng/article/details/140174352?spm=1001.2014.3001.5501


参考链接:

Updates in the SAP System (BC-CST-UP) | SAP Help Portalicon-default.png?t=N7T8https://help.sap.com/docs/SAP_NETWEAVER_701/6d9bbcd26c4b101488b4a6a282b09136/5f6f8337dd34ca76e10000009b38f8cf.html?locale=en-US&q=V2%20Update%28Asynchronous%20Update%29


以上,如有不对,欢迎指正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1923161.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库mysql-对数据库和表的DDL命令

文章目录 一、什么是DDL操作二、数据库编码集和数据库校验集三、使用步骤对数据库的增删查改1.创建数据库2.进入数据库3.显示数据库4.修改数据库mysqldump 5.删除数据库 对表的增删查改1.添加/创建表2.插入表内容3.查看表查看所有表查看表结构查看表内容 4.修改表修改表的名字修…

经典关系抽取(一)CasRel(层叠式指针标注)在DuIE2.0数据集上的应用

经典关系抽取(一)CasRel(层叠式指针标注)在DuIE2.0数据集上的应用 关系抽取&#xff08;Relation Extraction&#xff09;就是从一段文本中抽取出&#xff08;主体&#xff0c;关系&#xff0c;客体&#xff09;这样的三元组&#xff0c;用英文表示是 (subject, relation, obj…

【Windows】硬链接和软链接(OneDrive同步指定目录?)

文章目录 一、场景带入二、Windows下的硬链接和软链接2.1 硬链接&#xff08;Hard Link&#xff09;2.2 软链接&#xff08;符号链接&#xff0c;Symbolic Link&#xff09;2.3 软链接和快捷方式2.4 应用场景 三、OneDrive中的应用3.1 错误姿势3.2 好像可行的尝试3.3 合理的解决…

SpringBoot使用Redisson操作Redis及使用场景实战

前言 在SpringBoot使用RedisTemplate、StringRedisTemplate操作Redis中&#xff0c;我们介绍了RedisTemplate以及如何SpringBoot如何通过RedisTemplate、StringRedisTemplate操作Redis。 RedisTemplate的好处就是基于SpringBoot自动装配的原理&#xff0c;使得整合redis时比较…

51单片机(STC8H8K64U/STC8051U34K64)_RA8889_8080参考代码(v1.3)

硬件&#xff1a;STC8H8K64U/STC8051U34K64 RA8889开发板 硬件跳线变更为并口8080模式&#xff0c;PS00x&#xff0c;R143&#xff0c;R142不接&#xff0c;R141无关 8080接口电路连接图&#xff1a; 实物连接图&#xff1a; RA8889开发板外接MCU连接器之引脚定义&…

防火巡查记录卡数字化平台

防火巡查记录卡数字化平台 利用凡尔码搭建防火巡查记录卡数字化平台是一个高效且实用的解决方案&#xff0c;能够显著提升防火巡查的效率和管理水平。替代纸质巡检造成的数据丢失等困扰。 一、如何注册凡尔码平台 百度搜索“凡尔码”找到平台地址即可注册开通。凡尔码平台通…

二叉树层序遍历?秒了!

废话不多说&#xff0c;直接上题&#xff0c;涉及到二叉树层序遍历的题目大部分都可以用这个方法&#xff1a; 示例&#xff1a;力扣102 二叉树的层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有…

实验8 视图创建与管理实验

一、实验目的 理解视图的概念。掌握创建、更改、删除视图的方法。掌握使用视图来访问数据的方法。 二、实验内容 在job数据库中&#xff0c;有聘任人员信息表&#xff1a;Work_lnfo表&#xff0c;其表结构如下表所示&#xff1a; 其中表中练习数据如下&#xff1a; 1.‘张明…

数据结构之单链表(赋源码)

数据结构之单链表 线性表 线性表的顺序存储结构&#xff0c;有着较大的缺陷 插入和删除操作需要移动大量元素。会耗费很多时间增容需要申请空间&#xff0c;拷贝数据&#xff0c;释放旧空间。会有不小的消耗即使是使用合理的增容策略&#xff0c;实际上还会浪费许多用不上的…

【Oracle】实验五 PL_SQL编程

【实验目的】 熟悉PL/SQL的数据类型和书写规则熟悉控制结构和游标的使用编写和运行函数、过程和触发器 【实验内容】 编写脚本文件&#xff0c;调试运行脚本文件&#xff0c;并记录结果。 本地子程序的编写及调试 1、编写一个PL/SQL块&#xff0c;功能用于打印学生信息。整…

【学习css1】flex布局-页面footer部分保持在网页底部

中间内容高度不够屏幕高度撑不开的页面时候&#xff0c;页面footer部分都能保持在网页页脚&#xff08;最底部&#xff09;的方法 1、首先上图看显示效果 2、奉上源码 2.1、html部分 <body><header>头部</header><main>主区域</main><foot…

深入解析香橙派 AIpro开发板:功能、性能与应用场景全面测评

文章目录 引言香橙派AIpro开发板介绍到手第一感觉开发板正面开发板背面 性能性能概况性能体验 应用场景移植操作系统香橙派 AIpro开发板支持哪些操作系统&#xff1f;烧写操作系统到SD卡中启动开发板的步骤查看系统提供的事例程序体验——开发的简洁性 视频播放展示ffmpeg简介f…

【Python3】自动化测试_用Playwright发送API请求

一、创建APIRequestContex实例 # 连接到 APIRequest&#xff0c;可用于 Web API 测试的 API。 myRequest myPlaywright.request# 创建APIRequestContext实例&#xff0c;该实例可用于发送 Web 请求 myRequestContext myRequest.new_context() myRequest.new_context(**kwargs…

【MySQL】8.复合查询

复合查询 一.基本查询回顾(新增子查询)二.多表查询三.自连接四.子查询1.单列单行子查询2.单列多行子查询——三个关键字3.多列子查询4.在 from 子句中使用子查询 五.合并查询六.总结 一.基本查询回顾(新增子查询) //1.查询工资高于500或岗位为MANAGER的雇员&#xff0c;同时还…

js逆向-webpack-python

网站&#xff08;base64&#xff09;&#xff1a;aHR0cHM6Ly93d3cuY29pbmdsYXNzLmNvbS96aA 案例响应解密爬取&#xff08;webpack&#xff09; 1、找到目标url 2、进行入口定位&#xff08;此案例使用 ‘decrypt(’ 关键字搜索 &#xff09; 3、找到位置进行分析 --t 为 dat…

【软件工具】VMware Workstation Pro 15.5安装

1、双击运行安装包程序 2、接受许可证协议 3、选择安装位置&#xff0c;建议非中文无空格&#xff0c;增强型键盘驱动程序可选 4、按照自身使用习惯勾选产品更新和客户体验提升计划 5、快捷方式 6、开始安装 7、稍等会儿(可以玩会儿手机) 8、可输入许可证也可直接完成&#xff…

《ElementUI/Plus 基础知识》el-tree 之修改可拖拽节点的高亮背景和线

前言 收到需求&#xff0c;PM 觉得可拖拽节点的高亮背景和线样式不明显&#xff01;CSS 样式得改&#xff01; 注意&#xff1a;下述方式适用于ElementUI el-tree 和 ElementPlus el-tree&#xff01; 修改 拖拽被叠加节点的背景色和文字 关键类名 is-drop-inner .el-tree…

几何距离与函数距离:解锁数据空间中的奥秘

几何距离&#xff1a;直观的空间度量 几何距离&#xff0c;顾名思义&#xff0c;是我们在几何学中熟悉的距离概念&#xff0c;如欧几里得距离、曼哈顿距离和切比雪夫距离等。这些距离度量直接反映了数据点在多维空间中的位置关系。 欧几里得距离&#xff1a;最为人熟知的几何距…

conda install问题记录

最近想用代码处理sar数据&#xff0c;解放双手。 看重了isce这个处理平台&#xff0c;在安装包的时候遇到了一些问题。 这一步持续了非常久&#xff0c;然后我就果断ctrlc了 后面再次进行尝试&#xff0c;出现一大串报错&#xff0c;不知道是不是依赖项的问题 后面看到说mam…

langchain-runnable底层原理

文章目录 langchainlangchain生态介绍langchainLCELrunnablerunnable基础能力介绍invokebatchstreamainvokeabatchastream__or__、__ror__pipeget_nameInputType (属性)OutputType (属性)input_schema (属性)output_schema (属性) langchain langchain生态介绍 langchain是一个…