转自:http://cyzhang811.spaces.live.com/blog/cns!38F91C71C3B250A!455.entry
SAP LUW 和DB LUW
曾经引用过一篇文章:http://cyzhang811.spaces.live.com/blog/cns!38F91C71C3B250A!191.entry,
讲述了SAP LUW和 DB LUW,不过说的不太明了。
一、DB LUW
DB LUW是确保数据库一致性的机制,是数据库级别的,和底层DBMS有关,和SAP系统无关。如下图,从一致性状态A到B,中间有一系列的数据库操作,一个BD luw以数据库提交commit结束,这些操作要么全都执行,要么全都不执行。当全部执行成功,则数据库进入一致性状态B,如果在此DB luw中发生错误,则将从DB luw开始的所有操作进行回滚,数据库还是在A状态。
这是在数据库级别实现的,和SAP系统无关。
在SAP系统中,DB luw commit and rollback 可以被显式或隐式的触发。显式触发如在程序中调用FM DB_Commit,使用abap commit work语句等;隐式触发database commit有:1、一个dialog结束,进入下一屏幕,2、调用FM,进入另一个工作进程,3、从另一个工作进程返回;隐式触发database rollback有:1、runtime error,2、error message。
不然是commit还是rollback,结束了一个DB luw,也即是开始了一个新的DB luw。
二、SAP LUW
我们知道sap系统中一个业务操作会有多个对话屏幕,只到save操作成功,才算完成了一个业务。那么仅使用DB luw是不能保证SAP 系统数据一致性的。如下图,如果只是最后屏幕300保存时的DB luw发生错误,那么在数据库级一致性机制作用下只能回滚这一个db luw使数据库处于g状态,而前几个db luw在屏幕结束时已经提交,进行的数据库更新会全部生效,从业务层面上讲,这是不合理的,因为这个业务并没有保存成功,我们需要回滚到A或a状态。SAP luw就是sap在DB luw基础上保证数据库一致性的一种机制。
一个SAP luw 可以跨多个对话屏幕,对多个DB luw进行捆绑,这样只到SAP luw中最后一个db luw结束,SAP系统才做整体修改。这种捆绑技术使SAP luw中的DB luw并不是真正的数据库更新,所以在SAP luw结束时,要么全都提交,要么对其中的所有数据库操作进行回滚。
在abap开发中可以使用FM for update 或 perform ..on commit来启用SAP luw,只到遇到commit和rollback,SAP luw 结束。
如使用call function …in update task,并不是立即执行,而是将其置于一个更新工作进程中,开启新的SAP luw,遇到commit work 才真正更新数据,否则将回滚。
三、SAP 事务
SAP 事务是指SAP应用程序, 可以使用事务码来开始一个sap 事务,它可以包含一个或多个sap luw,可以使用call transaction或submit 插入一个sap luw,也可以通过CALL FUNCTION... STARTING NEW TASK 使sap luw并行。