SAP LUW 应用场景一(PERFORM ON COMMIT/CALL FUNCTION IN UPDATE TASK)

场景:

abap开发中,数据库更新一般在最后保存的时候更新所有数据并及时进行数据库的提交回退来避免数据更新不一致。但是增强中由于要保持数据一致性,一般禁止进行数据库提交回滚操作,此时需要考虑到数据更新一致性的情况,如何保证增强中写的更新语句不被隐式的提交而是和最终数据的更新保持一致,或者增强中会触发隐式提交的代码的处理。

SAP LUW 中有两种语法

PERFORM subr ON { {COMMIT [LEVEL idx]} | ROLLBACK }

CALL FUNCTION update_function IN UPDATE TASK

                              [EXPORTING p1 = a1 p2 = a2 ...]

                              [TABLES t1 = itab1 t2 = itab2 ...].

可以比较好的应对上述场景

这两种语法简单来说就是在执行commit/rollback的时候再去执行form 或者更新模块内的更新语句。

测试如下:

SAP LUW 应用场景一(PERFORM ON COMMIT/CALL FUNCTION IN UPDATE TASK)_第1张图片

此时测试表1中数据为空,由于perform中的语句未执行,所以即使有隐式提交的代码也不会影响到测试表1的数据的提交

SAP LUW 应用场景一(PERFORM ON COMMIT/CALL FUNCTION IN UPDATE TASK)_第2张图片

当有I类型消息时,系统会触发隐式提交(仅仅做DB commit,不进行SAP LUW的提交),此时测试表1的数据提交数据库,无法保证测试表123数据的更新一致性,而测试表2暂未更新。

SAP LUW 应用场景一(PERFORM ON COMMIT/CALL FUNCTION IN UPDATE TASK)_第3张图片

此时测试表1数据已有,测试表2数据仍为为空

SAP LUW 应用场景一(PERFORM ON COMMIT/CALL FUNCTION IN UPDATE TASK)_第4张图片

SAP LUW 应用场景一(PERFORM ON COMMIT/CALL FUNCTION IN UPDATE TASK)_第5张图片

继续执行COMMIT时,会执行之前的on commit的perform,此时测试表3的数据未提交

SAP LUW 应用场景一(PERFORM ON COMMIT/CALL FUNCTION IN UPDATE TASK)_第6张图片

在COMMIT 执行结束后,测试表2和测试表3的数据均会存入,数据一致性得到保证。

SAP LUW 应用场景一(PERFORM ON COMMIT/CALL FUNCTION IN UPDATE TASK)_第7张图片

SAP LUW 应用场景一(PERFORM ON COMMIT/CALL FUNCTION IN UPDATE TASK)_第8张图片

可以考虑的使用情况:

1.在四代增强使用时,增强代码中含隐式提交,比如调用rfc进行某种操作且要保证在最终其它业务数据提交数据库时同时同步执行,可以使用该语法。使用perform...on要慎重,form中有问题(如dump)时会影响最终其它数据的最终提交。

2.增强中需要保存数据时,且要和其它数据在最后一起保存,使用该语法避免中间的标准代码中触发隐式提交的操作,导致数据不一致。

3.进行复杂的功能开发的时候也可以使用该语法控制逻辑流程。

注意:

1. form或者function中执行代码注意异常处理,避免影响整体数据最终的提交。

2. form无法进行参数传值,只能使用全局变量或者内存(抛入抛出的内存或者共享内存都可以)使用全局变量时,使用的是最终执行commit时的变量数据,而不是perform执行时的变量数据。

3. function可以使用import参数和表参数进行传值,必须勾选值传递,传出参数无效。

4. 如果同一个form 在commit 之前多次使用perform ... on commit ,则只会执行执行一次。

PS:隐式提交:

(1) When the system displays an SAP Screen

(2) When the system sends a dialog message(Okay: E,W, I;)

(3) Whenever there are synchronous and asynchronous RFC calls

(4) With call transaction or SUBMIT statement

最主要的是第一种,第三种,如果submit 程序时没有屏幕切换操作,也不会导致隐式提交,比如submit 一个只有选择屏幕的程序(或者在选择屏幕处有校验(非E))时并不会触发隐式提交。另外调用windows打开文件浏览器也会触发隐式提交。

 

 

 

 

你可能感兴趣的:(ABAP,abap,数据库,sap)