IT干货网

ABAP-关于COMMIT WORK 和COMMIT WORK AND WAIT

flyfish 2022年03月09日 SAP 188 0

转载:IT虾米网

首先说明一点:更新是异步的,更新是由SAP中UPD1和UPD2两个进程执行的,关于这两个进程各负责什么再说明一下:

UPD1先执行,主要是用于数据库表的更新,比如说写表

UPD2后执行,主要是用于一些数据的收集统计等的更新,比如说为BW收集一下数据等等

同时这个是可以在SM13看到的,如果看到日志中UPD1成功,UPD2失败,如有BW的取数,那肯定会丢数据的。

所以说COMMIT WORK是异步的,为了使其同步,所有就有了COMMIT WORK AND WAIT.

对于COMMIT WORK AND WAIT 来说,是可以判断是否更新成功的,SY-SUBRC NE 0就是有问题的。

上面是最简单的区别,再有:

  由于系统中COMMIT WORK的数量是有限的,比如说我们系统是4000个,同时只能提交4000个更新进程,对于COMMIT WORK来说,执行完就释放了,可以为后面的COMMIT WLRK继续使用;而对于COMMIT WORK AND WAIT是要执行完才释放的,所以对于没有必要同步更新的,也尽快使用异步,使得资源得到释放。

有时,在继 续处理前需 要确认对数 据库表所作 的更改。另 一方面,在 永久存储之 前可能需要 取消一些对 数据库表所作的更改。要确认对数 据库表的更 改,请使用 COMMIT WORK 语句。要在 永久存储之 前取消一些 更改,请使 用 ROLLBACK WORK 语句。这些语句在 对话编程( 即 SAP 事务、数据 库事务、打 开或关闭屏 幕等等,有 关对话编程 的概述,参 见编写 ABAP/4 事务)中起着 十分重要的 作用。在本 主题中,您 将了解到如 何在 ABAP/4 报表中使用 COMMIT WORK 和 ROLLBACK WORK( 参见编写 ABAP/4 报表)。

在 ABAP/4 报表中,可 能有几个作 业联系在一 起形成作业 的逻辑单元 (LUW) 。通常,可 能要处理 LUW 中的所有动作,或什么 也不要处理 。假设 LUW 中包含了将 五行插入到 数据库表中 的进程。如 果事务成功 ,所有五行 都将存储在 数据库表中 (这包含一 个更新请求 和一个数据 库事务)。 在显示新屏 幕之前,数 据库事务将 自动结束( ABAP/4 报表的结束 )。在 ABAP/4 报表中不能 以任何方式 影响该进程,如果要保证 数据库中当 前所作的更 改立即被确 认,那么, 就必须使用 COMMIT WORK 语句结束 LUW。COMMIT WORK 在程序代码 中标记了 LUW 结束并启动 更新任务( 参见 COMMIT WORK 处理 )。在 COMMIT WORK 语句以后, 对数据库所 作的所有更 改都不能再 取消。

但是,如果 在 LUW 中出现了错 误,就必须 取消已经执 行的部分。 这意味着当 前没有任何 插入的行能 永久地保存 在数据库中 。要撤销当 前 LUW 对数据库的 更改,请使 用 ROLLBACK WORK, 它将取消前 一次数据库 提交后的所 有更改。

要确认对数 据库表的更 改并使它们 不能再取消 ,请按如下 格式使用 COMMIT WORK 语句:

语法

COMMIT WORK [AND WAIT].
如果使用 AND WAIT 选项,那么 在程序继续 执行以前, 它要等到更 新任务的结 束。如果更 新是成功的 ,SY-SUBRC 
就设置为 0。如果 SY-SUBRC 返回一个非 零值,就没 有成功的存 储所作的更 改。
要在保存之 前取消对数 据库表所作 的更改,请 按下列形式 使用 ROLLBACK WORK 语句:

语法

ROLLBACK WORK.

如果对更改 的取消是成 功的,SY-SUBRC 就设置为 0。如果 SY-SUBRC 返回一个非 零值,就没 有成功地取 消所作的更 改。


使用 COMMIT WORK 和 ROLLBACK WORK 语句的结果 是将丢失所 有的数据库 光标。因此 ,在 SELECT 循环中或在 处理 SQL 语句之前不 允许使用这 些语句。

关于 COMMIT WORK 和 ROLLBACK WORK 的详细信息 ,请参考关 键字文档。

TABLES SPFLI. 
DATA FLAG. 
SPFLI-CARRID = 'UA'. SPFLI-CONNID = '0011'.  
SPFLI-CITYFROM = ............ 
INSERT SPFLI. 
IF SY-SUBRC <> 0. 
   FLAG = 'X'. 
ENDIF. 
SPFLI-CARRID = 'LH'. SPFLI-CONNID = '1245'.  
SPFLI-CITYFROM = ............ 
INSERT SPFLI. 
IF SY-SUBRC <> 0. 
   FLAG = 'X'. 
ENDIF. 
SPFLI-CARRID = 'AA'. SPFLI-CONNID = '4574'.  
SPFLI-CITYFROM = ............ 
INSERT SPFLI. 
IF SY-SUBRC <> 0. 
   FLAG = 'X'. 
ENDIF. 
  ................ 
  ................ 
IF FLAG = 'X'. 
   ROLLBACK WORK. 
ELSE. 
   COMMIT WORK. 
ENDIF.

在该示例中 ,LUW 将在 SPFLI 中插入一系 列特定的行 。在每个 INSERT 语句后,程 序将检查操 作是否成功 ,或检查具 有相应的主 码字段(CARRID 和 CONNID) 的行是否已 经在 SPFLI 中存在。稍 后,程序将 FLAG 设置为“X” 。如果对于 每一个 INSERT 语句,SY-SUBRC 没有设置为 0,那么最 后一个 IF 语句中的 ROLLBACK WORK 语句将取消 对数据库的 所有更改。 否则,用 COMMIT WORK 语句确认这 些更改。

 


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

ABAP-面向对象的开发