关于SAP LUW与Lock Object的一些理解

为什么会有SAP LUW 与Lock object?
SAP系统基于三层架构, 当SAP GUI请求到达应用服务器后,分配到一个DIALOG 工作进程中,在这个进程里面DB接口可以进行OpenSQL到数据库的更新操作, 当一个屏幕处理完毕后, 会释放掉所使用的DIALOG工作进程,从而可以尽快地处理其它用户请求. 屏幕处理后会触发隐式的DB 提交,而在一个业务流程中,用户操作会跨越多个屏幕, 这样DB的LUW就不足以支持业务数据的一致性,所以SAP提供了SAP LUW以将多个操作绑定为一个逻辑单元里, 全部更新或全部取消. 而在业务操作过程中,比如修改订单时,需要对这个订单有独占性的使用, 所以对数据的访问需要有并发的控制, SAP提供了锁对象.


ABAP中的数据库更新包括两种
1> Inline update,
     直接在程序中使用OpenSQL更新表内容, 或者通过PERFORM ...  ON COMMIT 来更新表内容.
2> Update module
    这种是通过将各个Dialog step中的数据写入到一个LOG表VBLOG中(transparent tables VBHDR, VBMOD, VBDATA, and VBERROR),然后最后一起更新到DB中去,成功后,则删除LOG表中的记录.否则,则标识失败
    技术实现: 通过update function module.只有IMPORTING TABLES参数,忽略EXPORTING, EXCEPTIONS
    在使用过程中,注意COMMIT WORK的使用, 它将会触发数据库提交更改.
    而使用UPDATE 函数模块时, 可以有以下几种使用方式:
    A. 异步更新  COMMIT WORK.  更新在UPDATE 工作进程中进行,适合对数据库较长时间操作的程序.
    B. 同步更新  COMMIT WORK AND WAIT  更新在另外一个工作进程中进行.
    C. 本地更新  SET UPDATE TASK LOCAL 还是占用原来的DIALOG工作进程,但是不会写入数据到VBLOG中,避免了IO操作,速度快.适应于Batch mode.
  注意:
      在进行数据库更新时注意SY-SUBRC的返回值, 另外注意多个OPEN SQL更新操作是否需要在同一个LUW中, 以便处理操作失败后恢复. 
    
锁概念
SAP Lock 必须在LUW期间维护, SAP Lock基于Lock object实现, 定义在DDIC中,它允许锁住一个表中的一条或多条记录或者根据外键关系锁住多个表中的记录.
有两个function: ENQUEUE_xxx and DEQUEUE_xxx用来加锁与解锁.
加锁
加锁后在Lock talbe中加入一条记录,注意Lock table存在于内存中,在整个SAP系统中只有一个,可以使用SM12来维护.
ENQUEUE_XXX主要有参数:
    锁类型分为三种类型的锁E独占锁,S共享锁,X
    KEY字段
    _scope: 定义了锁相对于LUW的持续时间, 1 程序内 2 Update module 3两者皆有.
释放锁
主要是跟加锁时的_scope有关
   1,需要显式调用DEQUEUE_xxx 函数 
   2. 至少有一个CALL FUNCTION ... FOR UPDATE TASK注册了, 并且使用COMMIT WORK时自动释放锁
   3. Update 与程序都需要释放锁.
注意
  DEQUEUE_ALL 这个FM,可以释放所有加的锁, 但是注意如果使用CALL FUNCTION ... FOR UPDATE TASK时, 很有可能锁被提前释放掉,所以这时最好使用COMMIT WORK.
  还需要注意的是,加锁对性能的影响, 加锁后会影响到程序的并发性,所以加锁的时间应该尽可能的短.
  如果使用BDC程序调用时,程序中有COMMIT WORK它会中断掉BDC的处理,此时需要在调用BDC时使用OPTIONS FROM wa选项, 设置wa的RACOMMIT为X以防止它中断.
  LUW 问题
  向数据库中 删除数据, 插入数据, 假如插入失败,如何回退?
    A. 显式使用ROLLBACK WORK,注意不能在PERFORM XXXX ON COMMIT. 的子程序中使用,否则会有DUMP.
        也不能在 CALL FUNCTION XXXX IN UPDATE TASK的function module中使用
    B. 有A类型消息产生.

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值