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