锁表_防止数据重复执行
一、业务场景
- 根据业务提出需求,在一个拆分后台JOB执行的程序中,由于操作失误,短时间多次点击执行,将数据重复设置后台JOB,相同的数据形成了两条收货入库的数据,为了防止数据重复执行,将数据加锁,在执行数据的时候,先锁表行项目,如果再次执行同样的数据,判断该数据是否加锁,加锁则不执行
二、处理方法
-
使用事务码SE11给表建立锁,输入表名、锁模式以及锁表参数。
-
在执行的loop中对数据进行检查和锁表操作。注意在加锁后,执行完需要将锁释放。
"先查询是否对应的TOKEN和ZGUID有锁 CLEAR :lv_flag,lt_enq[],lt_enq. CALL FUNCTION 'ENQUE_READ2' EXPORTING gclient = sy-mandt gname = 'ZTMM2042_HEADLOG' garg = ' ' guname = sy-uname opcode2 = '1' * IMPORTING * NUMBER = * SUBRC = TABLES enq = lt_enq. IF lt_enq[] IS NOT INITIAL. LOOP AT lt_enq . SEARCH lt_enq-garg FOR gs_head-token. IF sy-subrc = 0. SEARCH lt_enq-garg FOR gs_head-zguid. IF sy-subrc = 0. lv_flag = 'X'. ENDIF. ENDIF. ENDLOOP. ENDIF. "对有锁的数据不进行后续执行,只标记为Z. IF lv_flag = 'X'. gs_head-resultstatus = 'Z'."标记为Z的数据为已经在执行的重复数据,在最后不用存储日志表,防止将执行成功的数据再次覆盖。 MODIFY gt_head FROM gs_head. CLEAR gs_head. CONTINUE. ENDIF. CALL FUNCTION 'ENQUEUE_EZZTMM2042_HEADL' EXPORTING mode_ztmm2042_headlog = 'X' mandt = sy-mandt token = gs_head-token zguid = gs_head-zguid * X_TOKEN = ' ' * X_ZGUID = ' ' _scope = '2' * _WAIT = ' ' * _COLLECT = ' ' EXCEPTIONS foreign_lock = 1 system_failure = 2 OTHERS = 3. IF sy-subrc <> 0. * Implement suitable error handling here ENDIF. "解锁 CALL FUNCTION 'DEQUEUE_EZZTMM2042_HEADL' EXPORTING mode_ztmm2042_headlog = 'X' mandt = sy-mandt token = gs_head-token zguid = gs_head-zguid * X_TOKEN = ' ' * X_ZGUID = ' ' _scope = '3' * _WAIT = ' ' * _COLLECT = ' ' .