Chinaunix首页 | 论坛 | 博客
  • 博客访问: 394931
  • 博文数量: 120
  • 博客积分: 6000
  • 博客等级: 准将
  • 技术积分: 1266
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-16 16:04
文章分类

全部博文(120)

文章存档

2011年(4)

2010年(10)

2009年(38)

2008年(68)

我的朋友

分类:

2009-01-10 18:53:32

一个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的数据,更新数据库。
阅读(1200) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~