update task锁、连续调用bapi的锁

_SCOPE               = '2'

= 1 时在事务结束会解锁。

= 2时call function in update task(执行完)可以解锁(commit触发,非commit解锁)。

= 2    call function in update task可以继承这个锁,所以call function in update task事务结束了会解锁

 

bapi中加了 _SCOPE               = '2'的锁,bapi commit的时候,触发bapi中的update task,update task执行完才会解锁,所以bapi commit执行完锁是还没有解掉的。

使用 local update,update不再提交到update work process完成,会在本work process同步执行,所以执行完commit就解锁完了。

 

等锁

手动wait

data lt_SEQG3 like table of SEQG3 with header line.

do.

CALL FUNCTION 'ENQUEUE_READ'

EXPORTING

GUNAME = SY-UNAME

TABLES

ENQ = lt_SEQG3.

read table lt_seqg3 into ls_seqg3 with key gname = 'LUBU' garg = lv_garg.

      endloop.

if sy-subrc ne 0.

exit.

endif.

enddo.

自动wait(自己session不会wait,只会累计,测试 X 模式也不行)

    call function 'ENQUEUE_ELLUBUE'

      exporting

        mode_vbak      = 'E'            

        mandt          = sy-mandt

        lgnum          = lgnum

        ubnum          = ubnum

        _wait          = abap_true

      exceptions

        foreign_lock   = 1

        system_failure = 2

        others         = 3.

 

不建锁对象加锁

1、锁表的通用函数:

    data:

      lv_key(255),

      lv_rtype    type bapi_mtype,

      lv_rtmsg    type bapi_msg.

    lv_key = sy-mandt && gt_alv-vbeln.

    perform frm_lock using 'VBAK' lv_key changing lv_rtype lv_rtmsg.

    if lv_rtype = 'E'.

      message s001(00) with lv_rtmsg display like 'E'.

      leave list-processing and return to screen 0.

    endif.

form frm_lock  using uv_tabname uv_key changing cv_rtype cv_rtmsg.

 

  data ls_rstable like rstable.

  ls_rstable-tabname = uv_tabname.

  ls_rstable-varkey = uv_key.

 

  call function 'ENQUEUE_E_TABLE'

    exporting

      tabname        = ls_rstable-tabname

      varkey         = ls_rstable-varkey

    exceptions

      foreign_lock   = 1

      system_failure = 2

      others         = 3.

  if sy-subrc ne 0.

    cv_rtype = 'E'.

    message id sy-msgid

      type sy-msgty

      number sy-msgno

      with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 into cv_rtmsg.

    return.

  else.

    cv_rtype = 'S'.

  endif.

endform.

 

2、为表解锁的通用函数:

perform frm_unlock using 'AUFK' lv_key.、

 

form frm_unlock  using uv_tabname uv_key.

 

  data ls_rstable like rstable.

  ls_rstable-tabname = uv_tabname.

  ls_rstable-varkey = uv_key.

 

  call function 'DEQUEUE_E_TABLE'

    exporting

      mode_rstable = 'E'

      tabname      = ls_rstable-tabname

      varkey       = ls_rstable-varkey

      x_tabname    = ' '

      x_varkey     = ' '

      _scope       = '3'

      _synchron    = ' '

      _collect     = ' '.

 

endform.

 

.

 

标准锁对象

标准锁对象

SE11,表所用处清单

 

调用

LOOP AT GT_OUT.

 

*预留

    CALL FUNCTION 'ENQUEUE_EMRESB'

      EXPORTING

        MODE_RESB      = 'E'

        MANDT          = SY-MANDT

        RSNUM          = GT_OUT-RSNUM

        RSPOS          = GT_OUT-RSPOS

*       RSART          =

*       X_RSNUM        = ' '

*       X_RSPOS        = ' '

*       X_RSART        = ' '

*       _SCOPE         = '2'

*       _WAIT          = ' '

*       _COLLECT       = ' '

      EXCEPTIONS

        FOREIGN_LOCK   = 1

        SYSTEM_FAILURE = 2

        OTHERS         = 3.

    IF SY-SUBRC <> 0.

        MESSAGE ID SY-MSGID

          TYPE 'S'

          NUMBER SY-MSGNO

          WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

      LEAVE LIST-PROCESSING.

    ENDIF.

 

  ENDLOOP.

 

注意:如果在锁定时key传入空值,则后面再次加锁时无论传入什么key都会返回sy-subrc = 1,请求的对象被锁定

 

 

数据库锁

DB01 点刷新

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值