• 表的锁机制


    SAP的一大特点,就是可以设置Batch Job,定时定量跑程序。但是这样就会碰到一个问题,会出现多个Batch job读写的情况。如果仅仅是读或是写的话,还好,最多是数据库延迟。但是如果对一个表,即读又写的话,就会产生数据一致性问题。比如,A Job读取数据X,然后做修改,但是修改的同时又有另外一个Job已经更新的X数据,结果A Job把另外一个更新的数据覆盖了,没有达到要预定的要求。

    这时候就要引进锁表机制:

               Exclusive lock: 排他锁,只有自己可以读、写

               Shared lock:共享锁,自己可以读、写,他人只能读

               Exclusive but not cumulative lock:排他但不累计,只有自己可以读、写,并且一个事务只能使用一次

     

    必须用’E’开头命名

    ‘E’+表名

    例程序

    1.首先用'ENQUEUE_READ'

    查询一下有没有 谁在使用表’ZTABLE’

    CALL FUNCTION 'ENQUEUE_READ'
         EXPORTING
           GCLIENT                     = SY-MANDT
           GNAME                       = 'ZTABLE'
    *   GARG                        = ' '
           GUNAME                      = ''
    *   LOCAL                       = ' '
    *   FAST                        = ' '
    * IMPORTING
    *   NUMBER                      =
    *   SUBRC                       =
          TABLES
            ENQ                         = IT_SEQG3
         EXCEPTIONS
           COMMUNICATION_FAILURE       = 1
           SYSTEM_FAILURE              = 2
           OTHERS                      = 3.
        IF SY-SUBRC <> 0.
          MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
          WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
        ENDIF.

        READ TABLE IT_SEQG3.

     

     

    2.加锁

    加锁
          CALL FUNCTION 'ENQUEUE_EZTABLE'
           EXPORTING
             MODE_ZTABLE          = 'E'
             TABNAME              = FIELS
    *         X_TABNAME            = ' '
    *         X_COUNTS             = ' '
    *         _SCOPE               = '2'
    *         _WAIT                = ' '
    *         _COLLECT             = ' '
           EXCEPTIONS
             FOREIGN_LOCK         = 1
             SYSTEM_FAILURE       = 2
             OTHERS               = 3
                    .
          IF SY-SUBRC <> 0.
            MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
                    WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
          ENDIF.

     

    TABNAME 被锁表ZTABLE的字段, FIELS字段的值;

    3.解锁

    *&--解锁
          CALL FUNCTION 'DEQUEUE_EZTABLE'
           EXPORTING
             MODE_ZTABLE       = 'E'
             TABNAME           = FIELS
    *         X_TABNAME         = ' '
    *         X_COUNTS          = ' '
    *         _SCOPE            = '3'
    *         _SYNCHRON         = ' '
    *         _COLLECT          = ' '
                    .

  • 相关阅读:
    【Spring cloud 系列】:构建Spring cloud (01)
    【MyBatis系列】:SpringMvc+MyBatis之初始化建表(01)
    【Log4J 系列】:log4j 整合SpringMVC+MyBatis 实现日志记录(01)
    【SSO单点系列】:CAS4.0 CAS整合SpringMVC+MyBatis实现数据库校验(04)
    【maven系列】:maven构建模块化项目之SpringMVC整合Mybatis (01)
    【maven系列】:maven构建模块化项目之SpringMVC (02)
    【MAVEN系列】:maven构建模块化项目之SpringMVC (01)
    杂篇
    Android anr 问题处理步骤
    关于App的launcherActivity重复启动的问题
  • 原文地址:https://www.cnblogs.com/caizjian/p/3248579.html
Copyright © 2020-2023  润新知