数据库显式和隐式commit

1.显式的DB Commit

显式的DB Commit并没有对应的ABAP 语句来执行DB Commit,它是由平常的语句Commit Work来进行的.一个DB LUW中,我们是以该DB被打开,然后以DB Commit结束。

2.隐式的DB Commit

隐式的DB Commit更没有对应的ABAP语句来告诉系统(Okay,您给我偷偷模模做一下commit)。隐式的DB commit是由许多”未留意”的用户/系统操作所带来的附加影响,总结了一下,可以触发隐式DB Commit的操作主要有:

(1) When the system displays an SAP Screen

(2) When the system sends a dialog message(Okay: E,S, I; No:A,X)

(3) Whenever there are synchronous and asynchronous RFC calls

(4) With call transaction <tcode> or SUBMIT <program> statement

 

所以,从上面我当年范的错误中,也可以知道,如果我们不手动地为数据库操作语句加上commit work,当程序结束后(也就是会send msg或者selection screen等)会自动进行DB Commit;

同时,另外非常重要的一点就是,rollback只能在同一个DB LUW中进行操作,如果DB LUW被commit了,那么其将还原不了了。

同时,Debug会自动进行direct的DB LUW(注意,非update FM或perform <> on commit)的commit,所以,debug永远也就找不到答案了。

3. DB Commit与SAP LUW

正因为有了隐式的DB Commit,这时一个DB LUW结束了,同时该DB的物理锁被release了,所以,特别是在我们的Dynpro程序中我们需要定义SAP LUW,才需要了SAP Lock机制而不能依靠于DB Lock机制;

同时,我们知道,一个SAP LUW的结束是以commit work的ABAP语句为标志的,所以,这里就明白了,commit work在原理上将会带来如下的影响:

(1) 如果有打开的DB LUW,那么该DB LUW将会被结束

(2) 当前的SAP LUW将会被结束

 

另外,上面也已经提到,如果我们不是使用的direct的数据库更新技术,而是使用的如update FM或者perform <> On Commit这样的数据库更新技术,也就是说我们将数据库更新封装在一个SAP LUW中,这时上面的隐式的DB Commit是否会影响到这个SAP LUW中的数据库更新request呢?不会。

因为上面的隐式commit是针对DB Commit呢,而不是针对SAP Commit的。如果要执行上面SAP LUW中的数据库更新request,必须使用commit work这样的显式的DB/SAP Commit。

所以,这个时候就得注意了,特别是我们在程序中如果使用了Link program,也就是说牵涉到不同的session不同的program间的关系了,这时候,一定得保证,在前面program里的数据库更新请求是否被释放了(Commit)了,如果没有被commit,那么很遗憾,您的数据库更新就不会被执行了,这个时候虽然有隐式的DB commit,但并不起作用。



个人补充:

一个Report中默认含很多屏幕和function所以此时包含隐式的commit,但是我们需要养成即使commit的习惯,否则有时数据库没有更新但是需要去要从数据库表中读取数据.Function中只有运行到结果屏幕之后才会将数据更新到数据库中,如果使用Commit work and wait. 则会立即更新到数据库之中。


Test case

FUNCTION z_db_commit.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"----------------------------------------------------------------------
  DATA:
        i         TYPE i,
        lv_client TYPE mandt,
        lv_user   TYPE ernam,
        gs        TYPE ztest00,
        gt        TYPE TABLE OF ztest00.

  DO 10 TIMES.
    i = i + 1.
    lv_client = sy-mandt.
    lv_user   = sy-uname.
    gs-id = i.
    gs-mandt = lv_client.
    gs-createby = lv_user.
    APPEND gs TO gt.
  ENDDO.

  MODIFY ztest00 FROM TABLE gt.
*DELETE ztest00 FROM TABLE gt.
  COMMIT WORK AND WAIT. " We can see the result in the DB table ,if we do not use
   " this statement we can only see the data in DB table when the  function ends, because thers is new screen
   " displayed

ENDFUNCTION.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值