二维码

[ddic] BAPI_TRANSACTION_COMMIT与COMMIT WORK区别

Twilight发表于 2015-04-24 11:47tougegelol 最后回复于 2015-04-28 11:28 [复制链接] 15838 3

简要地看一下bapi_transaction_commit的代码,我们能很快看出其与commit work的区别。它会在执行commit work之后再调用一个buffer_refresh_all的函数
BAPI_TRANSACTION_COMMIT.jpg
所以bapi_transaction_commit额外地刷新了BAPI buffer缓冲区。

下面是bapi buffer的用处:
1、假设你的程序连续地调用了若干个bapi,然后在最后使用了commit work/bapi_transaction_commit,这样会一次性提交所有bapi更新
2、众所周知,bapi调用会检查一些错误,如数据库中数据的存在与否.例如第二个bapi可能必须去检查前一个bapi所写的数据的存在与否。但此时数据还没写入到数据库中,要等到待会而commit work的时候才会被写入。这是就需要缓存来存储这些信息,以保证不会引发错误。
3、让我们设想因为某种原因更新commit work失败了,数据未能写入数据库。如果你没有没有使用bapi_transaction_commit刷新缓冲区,下一次bapi调用将认为这些缓存仍将存在,这样会导致错误。

同样的道理也可以推及到回滚:你必须使用bapi_transaction_rollback来代替rollback work。它也会清空缓存,原因如下:
如果你使用rollback work来回滚第一个bapi,你必须确保缓冲区被清空,否则下一个bapi会认为这些数据仍然存在并错误地去尝试写数据

所以我们在连续修改很多表,而这些表又相互关联,或者循环修改表,最好使用bapi_transaction_commit

下面是SAP给出的标准解释:
  • By simply looking at BAPI_TRANSACTION_COMMIT code, we see quickly what is different from COMMIT WORK. It calls BUFFER_REFRESH_ALL function module right after COMMIT WORK.
  • So BAPI_TRANSACTION_COMMIT additionally refreshes a "BAPI buffer".

Here is what BAPI buffer is for:
  • Assuming your program calls BAPIs consecutively and use a COMMIT WORK/BAPI_TRANSACTION_COMMIT only at the end so that to commit all BAPI updates once (better performance).
  • As you know, BAPIs need to check errors like data missing in database. For example, the second BAPI may have to check the existence of data written by the previously called BAPI. The data doesn't exist in database yet, but as it knows it will be written later at COMMIT WORK time, it uses a buffer (memory) to store this information, so that no error is raised.
  • Let's suppose the update during the COMMIT WORK fails (for any reason), the data is not written to database. If you have not refreshed the buffer using BAPI_TRANSACTION_COMMIT, the next BAPI calls will consider that some data will exist later, that is wrong.
回复

使用道具 举报

tougegelol
这个东西很微妙,我遇见过奇怪的现象。

通过BAPI_INB_DELIVERY_CONFIRM_DEC实现内向交货的时候,

用BAPI_TRANSACTION_COMMIT执行完成后,会有一定的几率不能正确地获取已经“过账收货”的内向交货号的信息,

比如相关物料凭证号、项目、检验批号码、货物移动状态等字段的数值。

改为commit work and wait之后一切正常。
回复 支持 反对

使用道具 举报

Twilight
tougegelol 发表于 2015-4-27 09:44
这个东西很微妙,我遇见过奇怪的现象。

通过BAPI_INB_DELIVERY_CONFIRM_DEC实现内向交货的时候,

BAPI_TRANSACTION_COMMIT的import wait = ‘X’。参数没写吧,加wait表示同步,前面的bapi执行完成,才会执行下面的程序
回复 支持 反对

使用道具 举报

tougegelol
leon 发表于 2015-4-27 10:50
BAPI_TRANSACTION_COMMIT的import wait = ‘X’。参数没写吧,加wait表示同步,前面的bapi执行完成,才会 ...

不是的 都试过

应该是refresh buffer这个语句的作用
回复 支持 反对

使用道具 举报

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 返回列表