• DB LUW 与 SAP LUW(二)


    1.     能触发隐式提交的方式

    1.1.  显示一个新屏幕给用户时。

    Call screen......

    1.2.  RFC调用

    1.3.  abap出现运行错误

    1.4.  抛出 AX类的message导致程序终止

    Message ..  type A/X

    1.5.  使用语句CALL TRANSACTION 或者SUBMIT

    1.6.  Process

    在流逻辑定义中,process语句用于说明模块何时被调用,决定了事件触发的时机。Process也会造成隐式提交,当线程等待时,就会触发隐式提交。

    1.7.  WAIT UP TO n(n为某一I类型的数字SECONDS

    DB <wbr>LUW <wbr>与 <wbr>SAP <wbr>LUW(二)



    .    部分案例

    1)   DB LUW SUBMIT的关系DB <wbr>LUW <wbr>与 <wbr>SAP <wbr>LUW(二)

    该情况下数据库zlm_xdl_stu_1有两条数据

    REPORT程序zlm_dbluw_test含两个LUW: 第一个LUW包含两个DML语句(即该REPORT程序里的delete语句与insert语句),当调用SUBMIT语句时会触发隐式提交,结束此LUW;在REPORT程序zlm_db_data_test001里有一个DB LUW,该LUW包含一个DML语句(insert),该REPORT程序执行结束时会做一个隐式提交结束此LUW

    2)   SAP LUWSUBMIT的关系

    DB <wbr>LUW <wbr>与 <wbr>SAP <wbr>LUW(二)

    该情况下,数据库zlm_xdl_stu_1数据无任何变化

    REPORT程序zlm_db_Data_test001in update task方式调用FMzlm_insert_data,使得整个REPORT程序zlm_dbluw_test包含了一个SAP LUW,两个DB LUW。第一个DB LUWREPORT程序zlm_dbluw_test里的两个DML语句(即该REPORT程序里的delete语句与insert语句),第二个DB LUWREPORT程序zlm_db_data_test001里的CALL FUNCTION语句。在最后遇到ROLLBACK WORK语句时,将两个DB LUW所执行的DML语句都回滚,因此数据库数据无任何变化。另外SUBMIT程序里的显示或者隐式提交也会对原程序的DML语句有所影响。SUBMIT程序含如下语句时,影响各自不同:

     

    a)   COMMIT/ROLLBACK WORK:有可能会影响原程序DML语句的提交或者回滚。如在调用SUBMIT语句之前,原程序无显示的提交或者回滚操作,也没有其他的部分隐式提交或者回滚(调用RFC、报A或者X类型的message)操作,此时会对原程序的DML语句有明显的影响,如上截图

    b)   调用RFC语句或者报A/X类型的MESSAGE:与COMMIT/ROLLBACK WORK类似

    DB <wbr>LUW <wbr>与 <wbr>SAP <wbr>LUW(二)

    DB <wbr>LUW <wbr>与 <wbr>SAP <wbr>LUW(二)

    REPORT程序zlm_dbluw_test的两条DML语句执行成功

    c)   调用SUBMIT语句:即在SUBMIT语句里嵌套调用SUBMIT语句,嵌套调用的SUBMIT语句不会影响原程序(最初的那个程序)DML语句的提交或者回滚;

    REPORT程序zlm_dbluw_test的两条DML语句执行成功

     

    d)   被调用的SUBMIT(非嵌套调用的SUBMIT语句)出现运行时错误或者报A/X类型的MESSAGE:有可能会导致原程序的DML语句回滚;

    综上所述,对于SUBMIT语句应该慎用,即SUBMIT的隐式提交有风险

    3)   若在程序中调用RFC模式的FM、报A/X类型的MESSAGE、使用WAIT UP TO n SECONDS语句、报运行时错误都会对在同一个LUW内的DML语句有影响

     

    4)   另外,UPDATE模式的FM里不能写COMMIT/ROLLBACK WORK语句,因为该模式下的提交或者回滚操作都是在外面进行的。若在其内部写了提交或者回滚的语句,则能激活且不会检测出语法错误,也无扩展错误,但是执行后系统会发一个邮件给用户,提示更新终止;

    5)   SUBMIT程序中使用CALL TRANSACTION(跳转到指定T-CODE界面)语句时,会影响原程序中的DML语句,但不会影响CALL FUNCTION…IN UPDATE TASK语句的提交;

    6)   UPDATE模式的FMSUBMIT语句

    若在UPDATE模式的FM内部嵌套调用SUBMIT语句,且在调用该FM后紧跟着的调用COMMIT WORK语句,工作台会发给用户一封邮件提示更新终止,但调用UPDATE模式的FM前面的DML语句会成功执行。因为UPDATE内调用的SUBMIT会触发数据库的隐式提交功能,类似与COMMIT WORK语句。因此可以推想:若不掉用COMMIT WORK语句,UPDATE模式的FM前面的DML语句仍会成功执行。但是若将COMMIT WORK语句改为ROLLBACK WORK语句,则所有的DML语句都会回滚(针对于该REPORT程序,其它视场景而定)

    SAP LUW的实现思想

     

    将数据的更新推迟到最后一个DB LUW中,即前面无论有多少步骤,将每步所有更新操作都放在一个更新表里,待数据全部准备完毕,再在根据更新表里的index执行数据库的更新操作。

    DB <wbr>LUW <wbr>与 <wbr>SAP <wbr>LUW(二)


      总结

    LUW有两种实现方式:DB LUWSAP LUW

    DB LUW:上一个COMMIT WORK或者ROLLBACK处或者是程序开头处都有可能是当前DB LUW的开始,凡是能使进程发生中断的语句都能触发DB LUW的结束。

    SAP LUW:将多个DB LUW捆绑在一起,在遇到COMMIT WORK(AND WAIT)或者是ROLLBACK WORK时执行DML语句。若无此标识,则SAP LUW不会随着程序的结束或者进程的中断而隐式的提交或者回滚

    LUW其实现机制为将数据存储在更新表里,若发生提交操作,则会按照更新表里的INDEX值对数据依次进行操作。

    显示的提交或者回滚操作优先级高于隐式的提交或者回滚操作。


    最后还有个问题:

    如果调用bapi后又有更新自荐表操作;

    bapi里默认是in update task模式更新的

    会令起一个更新进程

    虽然调用bapi后可以根据return判断成功与否

    但是存在一种极端风险

    就是return虽然返回成功,但是更新进程真正执行的时候出错了

    这个时候就会导致数据错误


    如果想预防这种极端情况,两种方案:

    1>更新自荐表的时候也用in update task :

    (比如也用Function更新,建议用Function模式更新,不建议用form更新,然后加 on conmmit )

    2>在调用bapi前,加一句 set update task local 

     然后更新完成自建表更新后,commit work,如果失败回滚

    set update task local :具体可以看F1

    作用是把当前的处理放在一个进程内

    即bapi内的in update task 不再新起进程


    在一个很小的范围内加这句话,commit后就失效了



     

    http://blog.sina.com.cn/sapliumeng
  • 相关阅读:
    C# WinForm 创建XML文件方法总结
    VB中的ADO数据对象编程详解[转载]
    01.15 10日沙盘Top20分析
    IPad上做开发——在线B/S开发表单
    沙盘选股失败:延迟性与随机性
    IPad上做开发——在线B/S用户定制型通用列表
    IL动态调试.NET 程序(without pdb files)
    IPad上做开发——在线B/S开发主从表
    01.17 10日沙盘Top20分析
    IIS7下配置WCF的netTcpBinding
  • 原文地址:https://www.cnblogs.com/senlinmu110/p/3802101.html
Copyright © 2020-2023  润新知