锁表_防止数据重复执行

锁表_防止数据重复执行
一、业务场景
  1. 根据业务提出需求,在一个拆分后台JOB执行的程序中,由于操作失误,短时间多次点击执行,将数据重复设置后台JOB,相同的数据形成了两条收货入库的数据,为了防止数据重复执行,将数据加锁,在执行数据的时候,先锁表行项目,如果再次执行同样的数据,判断该数据是否加锁,加锁则不执行
二、处理方法
  1. 使用事务码SE11给表建立锁,输入表名、锁模式以及锁表参数。

    在这里插入图片描述

    在这里插入图片描述

  2. 在执行的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              = ' '
          . 
        
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值