表的锁机制

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          = ' '
                .

原文地址:https://www.cnblogs.com/caizjian/p/3248579.html