SAP LUW下的回滚

2020-09-06 00:19发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


尊敬的专家们,我对SAP LUW有疑问,我一直对SAP LUW回滚机制感到困惑。

如ABAP文档所述,SAP LUW下不允许使用ROLLBACK WORK和COMMIT WORK语句,只有类型A的消息可以隐式回滚SAP LUW,我在下面进行了测试:

我的系统组件版本为:

我如下创建两个表YLUW1和YLUW2,并初始化值:

我写了一份报告来执行PERFORM ... ON COMMIT语句,这是SAP LUW的解决方案之一:

第一种情况,我使用类型为A的消息触发隐式回滚,并且可以正常工作,但是程序因错误而终止。

结果:

第二种情况,在sy-subrc检查下我什么都没写,表YLUW1成功插入,YLUW2插入失败。

结果:

最后一种情况,我引发了一个异常以触发隐式回滚,并且它可以正常工作,但是程序因错误而终止。

结果:

所有这些之后,我的问题是:当任何表插入/更新/删除错误时如何回退SAP LUW,并且我可以捕获SAP LUW错误然后进行处理。 > 1.jpg (47.0 kB)

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


尊敬的专家们,我对SAP LUW有疑问,我一直对SAP LUW回滚机制感到困惑。

如ABAP文档所述,SAP LUW下不允许使用ROLLBACK WORK和COMMIT WORK语句,只有类型A的消息可以隐式回滚SAP LUW,我在下面进行了测试:

我的系统组件版本为:

我如下创建两个表YLUW1和YLUW2,并初始化值:

我写了一份报告来执行PERFORM ... ON COMMIT语句,这是SAP LUW的解决方案之一:

第一种情况,我使用类型为A的消息触发隐式回滚,并且可以正常工作,但是程序因错误而终止。

结果:

第二种情况,在sy-subrc检查下我什么都没写,表YLUW1成功插入,YLUW2插入失败。

结果:

最后一种情况,我引发了一个异常以触发隐式回滚,并且它可以正常工作,但是程序因错误而终止。

结果:

所有这些之后,我的问题是:当任何表插入/更新/删除错误时如何回退SAP LUW,并且我可以捕获SAP LUW错误然后进行处理。 > 1.jpg (47.0 kB)

付费偷看设置
发送
7条回答
1楼 · 2020-09-06 00:32.采纳回答

请记住" 创建子例程已过时" ,而是创建更新功能模块。 通过更新功能模块,任何RAISE或MESSAGE RAISING或MESSAGE E/A错误将显示为弹出窗口" Express Information 从作者"用户..."收到的快速文档"更新已终止" 确定-选择(详细信息)-收件箱",因此它比短转储或中止弹出式菜单更具攻击性,并且您可以通过SM13处理错误,并可能恢复错误。

更新任务的原理是使 所有可能的检查,以避免在COMMIT WORK之前发生数据库更新错误。如果更新任务内部发生错误,则为时已晚,并且只能中止(希望由于以前的所有检查,这种情况很少见)。

这是伪代码:

 TRY。
     do_sap_locks()。
     check_functional_errors_and_database_integrity_1()。
     通话功能...在更新任务中...
     check_functional_errors_and_database_integrity_2()。
     通话功能...在更新任务中...
     提交工作。

   捕捉...
     回滚工作。
 ENDTRY。

更新功能模块的伪代码(可能的消息类型为" E"或" A"):

从lw_data插入yluw1。
 如果sy-subrc <> 0。
   消息e001(00),带有" text1"和" text2",引发db_update_error。
    - 要么 - 
   带有'text1''text2'的消息e001(00)。
    - 要么 - 
   提高db_update_error。
 ENDIF。

樱桃小丸子0093
2楼-- · 2020-09-06 00:40

感谢伙计。

Doze时光
3楼-- · 2020-09-06 00:23

当您仅使用OPEN-SQL语句时,实际上并不需要整个LUW COMMIT/ROLLBACK,而只需要一些数据库 提交/回滚,因此请执行OPEN-SQL语句,当每条语句都正确时,请致电FM DB_COMMIT,以防出现任何错误,请致电DB_ROLLBACK。 ,请勿以交易程序的形式/方法进行更新,而是在"更新任务"中调用FM,然后执行"提交工作"。 在那些updayt中,FM会在出现SQL错误的情况下发出Abort'A'消息。

派大星 ヾ
4楼-- · 2020-09-06 00:42

谢谢家伙。

Bunny_CDM
5楼-- · 2020-09-06 00:28

在执行提交之前进行检查,从而触发 更新功能模块。

SAP小菜
6楼-- · 2020-09-06 00:24

更新FM中不允许进行回滚工作。

shere_lin
7楼-- · 2020-09-06 00:35

嗨,

请仔细检查以下文档。

SAP LUW

数据库逻辑工作单元(LUW)

您可以使用TRY ..... ENDTRY来捕获异常

 "与基于类的异常CX_SY_OPEN_SQL_DB一起使用。

 数据:lv_check类型参考cx_sy_open_sql_db,
       lv_text TYPE STRING
 尝试。

 从表格gt_itab中插入zXXXX。

 捕获CX_SY_OPEN_SQL_DB INTO lv_check。
      lv_text = lv_check-> get_text()。

 ROLLBACKWORK。

一周热门 更多>