abap 如何锁表

abap 如何锁表,第1张

首先要在 ABAP 字典中创建锁对象,然后才能在 ABAP 程序中设锁。创建锁对象时,系统会自动生成两个 FM 来进行锁管理。

用于设锁的 FM 为: ENQUEUE_<锁对象名>。它用于在锁表(Lock Table)中生成一个锁项(Lock Entry)。若设锁不成功的话,就会在 Return 中反映出来。

用于释放锁的 FM 为:DEQUEUE_<锁对象名>。它用于从锁表中删除一个锁项。

在 ABAP 程序中,只需使用 "CALL FUNCITION ..." 语句就可以调用它们。

这两个锁 FM 是在 SAP 系统的一个特殊工作进程中执行的,专门进行锁管理。它运行在一个单独的服务器上,而该服务器专门用于维护整个 SAP 系统的主锁表(Central Locak Table)。

有两种锁类型:

共享锁——只读锁,一个用户正在读数据时,阻止其他用户更改该数据。

独占锁——可写锁,一个用户正在修改数据时,阻止其他用户更改该数据。

在se11中创建锁对象Lock Object

创建Lock Object后,激活,会产生两个Function,

如你的锁对象叫EZTEST,那么会生成ENQUEUE_EZTEST以及DEQUEUE_EZTEST

调用这两个function进行加锁及解锁,具体的上网查一下锁对象的内容

注意锁对象的三种类型,独占锁、累积锁和非累积锁的区别

需求是当系统更改了mm02 的长文本的时候做一个增强,找了半天,值是读到了,可长文本的条目也太多了,根本没法确定哪条是对的

这个时候怎么办,先找个隐式增强,保证mm01 和 mm02 *** 作都会经给找个地方

SELECT SINGLE CLASSNAME

                FROM  RZLLITAB

                INTO  G_CLASSNAME  "Server Group Name

              WHERE  APPLSERVER = G_APPLSERVER

                AND  GROUPTYPE = 'S'.  "S:服务器组,空:登陆组

LV_MATNR = WMARA-MATNR.

CALL FUNCTION 'ZFM_SAP_SRM_011' STARTING NEW TASK LV_MATNR

  DESTINATION IN GROUP G_CLASSNAME

  PERFORMING FRM_SAP_CRM ON END OF TASK

  EXPORTING

    IV_MATNR = LV_MATNR.

FORM FRM_SAP_CRM USING NAME.

  RECEIVE RESULTS FROM FUNCTION 'ZFM_SAP_SRM_011'.

ENDFORM.

DATA : GNAME LIKE SEQG3-GNAME VALUE 'MARA',

        GARG        LIKE  SEQG3-GARG,

        GUNAME      LIKE  SEQG3-GUNAME,

        LT_ITAB    TYPE ZFM_SAP_SRM_007_INS,

        LS_ITAB    LIKE LINE OF LT_ITAB,

        IM_JSON_STR TYPE STRING,

        EX_JSON_STR TYPE STRING,

        LT_OUTS    TYPE ZFM_SAP_SRM_007_OUTS,

        LS_OUTS    LIKE LINE OF LT_OUTS,

        LV_KEY01    TYPE ZKEY01,

        RAW_ENQ    LIKE  SEQG7 OCCURS 0 WITH HEADER LINE.

  CONCATENATE SY-MANDT IV_MATNR INTO GARG.

  BREAK GB05.

  DO 10 TIMES.

    CALL FUNCTION 'ENQUE_READ2'

      EXPORTING

        GNAME  = GNAME

        GARG  = GARG

        GUNAME = GUNAME

      TABLES

        ENQ    = RAW_ENQ.

    IF RAW_ENQ[] IS INITIAL.

      EXIT.

    ELSE.

      WAIT UP TO 1 SECONDS.

    ENDIF.

  ENDDO.

  IF RAW_ENQ[] IS NOT INITIAL.

    ZTYPE = 'E'.

    CONCATENATE '物料号码' IV_MATNR '被锁定,请稍后处理!' INTO ZMESSAGE.

    EXIT.

  ENDIF.

最终结果 

原理是启用异步调用后,你程序执行 我和你是并行的,但是我读取物料号是否被你原来程序锁止了,如果你锁止放开了,我这个程序拿到物料号,当然完成一个长文本读取是so easy.

你耍流氓我也来,哈哈  等你mm01 或者mm02跑完了 我再去抓你保存好的数据,然后再进行 *** 作


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7899437.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-11
下一篇2023-04-11

发表评论

登录后才能评论

评论列表(0条)

    保存