一个SAP LUW包含一些逻辑意义上一起的change,这些change要么全部执行,要么全不执行(all or nothing原则)。
一般来说,一个业务交易代码不会仅由一个SAP LUW来处理。整个过程会被分割成多个单独的逻辑部分,每个部分都对应一个SAP LUW.
一个Database LUW也包含许多change,直到数据库的状态再次sealed(DB COMMIT).
在一个Database LUW里,总是可以丢弃在DB ROLLBACK那点以前发生的所有改变,Database状态被重置到当前的Database LUW产生之前的状态。如果发生错误,可以用ROLLBACK WORK来恢复数据库以前的状态。
通过一个DB COMMIT,当前的数据库状态变为sealed。变为vsealed之后,就不可以丢弃这个LUW所有的改变了。
如果在SAP LUW的处理过程中发生错误,通常希望可以回到SAP LUW开始之前的已处在的数据库状态,来保持数据的一致性。为了实现这个目的,SAP LUW必须在一个DB LUW里来处理。
可以通过ABAP语句:COMMIT WOKR和ROLLBACK WORK显式的实现DB COMMIT和DB ROLLBACK。还有一些情况也会隐式的触发DB COMMIT。
隐式的DB COMMIT一般都发生在程序等待的情况下,如:
系统显示SCREEN
系统发出一个DIALOG MESSAGE
同步异步的RFC调用的时候
使用语句CALL TRANSACTION
或者SUBMIT 。
由于以上原因,一个SAP LUW里的隐式的DB COMMIT或者改变一般不可以放在不同的屏幕里面来处理,因为那样的话这些步骤不会在一个DB LUW里了,不在一个DB LUW就会导致数据的不一致性,也不符合all or nothing的原则。一般情况,把之前要改变的数据都保存到global的变量里面,到最后一个屏幕来处理这个global的数据,更新数据库。
阅读(1230) | 评论(0) | 转发(0) |