天天看点

ABAP 如何进行OO面向对象的事务管理

在上一篇文章里面,我们提到了ABAP的对象持久化实现,这次我们如何以面向对象的方式进行ABAP面向对象的持久化对象事务管理?

在传统的SAP编程里面,SAP事务管理是基于SAP LUWs。所有的数据都绑定到一个DB LUW里面。例如程序中执行的数据更改,以及注册到LUW里面以后执行(并不立即执行)的程序,例如子程序(使用 PERFORM ON COMMIT 注册的) 、更新程序函数(使用CALL FUNCTION IN UPDATE TASK)。这两种注册的程序都会在COMMIT WORK之后被执行。

而在面向对象的事务管理也是Transaction Service 也是基于SAP LUWs,并不是新的概念。所以它并没有单独创建注册到数据库的方法,也是基于传统的更新函数的方法进行事务管理,相当于用面向对象方式将其进行了封装。

ABAP 如何进行OO面向对象的事务管理
cl_os_system=>init_and_set_modes( i_external_commit = oscon_false
                                    i_update_mode = oscon_dmode_default ).      

i_external_commit  表示是否允许过程中使用类似于COMMIT WORK的语句,如果为true,那么代码里面COMMIT WORK将影响数据的改变。一般建议是false,这样才能保证整个面向对象事务设计。

i_update_mode       更新方式 

  •          OSCON_DMODE_DEFAULT 或者 OSCON_DMODE_UPDATE_TASK: 异步更新
  •          OSCON_DMODE_UPDATE_TASK_SYNC: 同步更新(相当于 COMMIT WORK AND WAIT)
  •        OSCON_DMODE_DIRECT 或者 OSCON_DMODE_LOCAL: 本地更新 (类似于 SET UPDATE TASK LOCAL)

那我们将上次代码进行一个优化,加入面向对象的事物管理

REPORT znb_persist_test.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
PARAMETERS : p_get RADIOBUTTON GROUP g1,
             p_cre RADIOBUTTON GROUP g1,
             p_del RADIOBUTTON GROUP g1.
SELECTION-SCREEN END OF BLOCK b1.

SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-002.
PARAMETERS :
  p_guid LIKE ztnb_test-guid,
  p_text LIKE ztnb_test-text.
SELECTION-SCREEN END OF BLOCK b2.

SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE TEXT-003.
PARAMETERS:  p_test TYPE char1 AS CHECKBOX.
SELECTION-SCREEN END OF BLOCK b3.


CLASS lcl_application DEFINITION.
  PUBLIC SECTION.
    "!主程序
    CLASS-METHODS: run.
    "!注册一个方法 用来监听事务的状态
    CLASS-METHODS: handle FOR EVENT finished OF if_os_transaction IMPORTING status.

ENDCLASS.


CLASS lcl_application IMPLEMENTATION.

  METHOD handle.
    WRITE:/ status.
  ENDMETHOD.


  METHOD run.
    DATA go_transaction_manager TYPE REF TO if_os_transaction_manager.
    DATA go_transaction  TYPE REF TO if_os_transaction.

    DATA : go_ztnb_test_agent TYPE REF TO zca_persist_ztnb_test,
           go_ztnb_test       TYPE REF TO zcl_persist_ztnb_test.

    go_transaction_manager = cl_os_system=>get_transaction_manager( ).
    go_transaction         = go_transaction_manager->create_transaction( ).
    SET HANDLER handle FOR go_transaction."注册一个方法 用来监听事务的状态
    go_transaction->start( ).
    "创建操作类对象
    go_ztnb_test_agent = zca_persist_ztnb_test=>agent.
    IF p_get = abap_true.
      TRY.
          "调用操作类,读取持久化记录,初始化持久类并对属性赋值
          go_ztnb_test ?= go_ztnb_test_agent->get_persistent( i_guid = p_guid ).
          WRITE : / 'GUID:',go_ztnb_test->get_guid( ).
          WRITE : / 'TEXT:',go_ztnb_test->get_text( ).
        CATCH cx_os_object_not_found.
          MESSAGE 'Oject does not exist.' TYPE 'E'.
      ENDTRY.

    ELSEIF p_cre = abap_true.
      TRY.
          "调用操作类,查询数据库中是否存在持久化记录
          go_ztnb_test ?= go_ztnb_test_agent->get_persistent( i_guid = p_guid ).
        CATCH cx_os_object_not_found.
      ENDTRY.

      IF go_ztnb_test IS BOUND.
        MESSAGE 'Oject already exist.' TYPE 'E'.
      ENDIF.

      TRY.
          "调用操作类,创建持久化类的属性和主键记录到数据库表
          go_ztnb_test = go_ztnb_test_agent->create_persistent(
               i_guid = p_guid
               i_text = p_text
               ) .
          WRITE : / 'Object Created.'.

        CATCH cx_os_object_existing .
          MESSAGE 'Oject already exist.' TYPE 'E'.
      ENDTRY.

    ELSEIF p_del = abap_true.
      TRY.
          "调用操作类,查询数据库中是否存在持久化记录
          go_ztnb_test ?= go_ztnb_test_agent->get_persistent( i_guid = p_guid ).
          "调用操作类,按主键删除持久化记录
          go_ztnb_test_agent->delete_persistent( i_guid = p_guid ).
          WRITE : / 'Object Deleted.'.
        CATCH cx_os_object_not_found.
          MESSAGE 'Oject does not exist.' TYPE 'E'.
        CATCH cx_os_object_not_existing .
          MESSAGE 'Oject does not exist.' TYPE 'E'.
      ENDTRY.
    ENDIF.

    IF p_test = abap_true.
      go_transaction->undo( ).
    ELSE.
      go_transaction->end( ).
    ENDIF.
  ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.
  lcl_application=>run( ).

LOAD-OF-PROGRAM.
  cl_os_system=>init_and_set_modes( i_external_commit = oscon_false
                                    i_update_mode     = oscon_dmode_default ).      

继续阅读