设为首页 收藏本站
查看: 1159|回复: 0

[经验分享] SAP 锁机制

[复制链接]

尚未签到

发表于 2015-9-18 12:01:19 | 显示全部楼层 |阅读模式
SAP 锁机制

转自:http://scnblogs.techweb.com.cn/abap/archives/6.html

SAP锁机制

  一、SAP为什么要设置锁:
   1,保持数据的一致性
     如果几个用户要访问同样的资源,需要找到一种同步访问的方法去保持数据的一致性。比如说,在航班预订系
  统中,需要检查还有没有空座位,当检查的时候,你不想别人修改重要的数据(空座位的数量)。
   2,仅仅用Database锁是不够的
     数据库管理系统物理锁定了要修改的行记录,其他用户要等到数据库锁释放才能访问这个记录。
     在SAP系统中,当一个新屏幕显示的时候会释放掉Database锁,因为屏幕的改变会触发一个隐式的DB COMMIT
  。如果数据是从好几个屏幕收集来的话,而且在这段时间内这些数据会分别被锁定,仅仅用Database锁就不够了。
     SAP系统在应用服务器层面有一个全局的LOCK TABLE,可以用来设置逻辑锁来锁定相关的表条目,并有
  ENQUEUE工作进程来管理这些锁。SAP锁是一种逻辑意义上的锁,有可能你锁定的表条目在DATABASE上根本就
  不存在。

二、锁对象和其对应的Function Module
    在SE11里创建锁对象,自定义的锁对象都必须以EZ或者EY开头来命名。一个锁对象里只包含一个PRIMARY
  TABLE,可以包含若干个SECONDARY TABLE,锁的模式有三种:E,S,X。LOCK PARAMETERS里填写你要根
  据哪些字段来锁定表条目。
    模式E:当更改数据的时候设置为此模式。
    模式S:本身不需要更改数据,但是希望显示的数据不被别人更改。
    模式X:和E类似,但是不允许累加,完全独占。
    如果你在一个程序里成功对一个锁对象加锁之后,如果模式为E,其他用户不能再对这个锁对象加E、X、S模式
  的任意一种锁;
    如果你在一个程序里成功对一个锁对象加锁之后,如果模式为X,其他用户不能再对这个锁对象加E、X、S模式
  的任意一种锁;
    如果你在一个程序里成功对一个锁对象加锁之后,如果模式为S,其他用户不能再对这个锁对象加E、X模式的
  锁,但是可以加S模式的锁;
    如果你在一个程序里成功对一个锁对象加锁之后,如果模式为E,在这个程序,你还可以再对这个锁对象加E、
  S模式的锁,X模式的不可以。
    如果你在一个程序里成功对一个锁对象加锁之后,如果模式为X,在这个程序,你不可以再对这个锁对象加E、
  X、S模式的锁。
    如果你在一个程序里成功对一个锁对象加锁之后,如果模式为S,在这个程序,你还可以再对这个锁对象加S模
  式的锁,如果没有别的用户对其加S模式的锁,那么你还可以对其加E模式的锁。X模式的不可以。
    当激活锁对象的时候,系统会自动创建两个FM,ENQUEUE_<锁对象名>和DEQUEUE_<锁对象名>,分别用来锁
  定和解锁。

三、锁定和解锁
    当用逻辑锁来锁定表条目的时候,系统会自动向LOCK TABLE中写入记录。
    当调用设置锁的FM时,LOCK PARAMETERS如果没有指明,系统会锁定整个表。当然,LOCK PARAMETER:
  CLIENT有点特殊,如果不指定,默认是SY-MANDT;如果指定相应的CLIENT,会锁定对应CLIENT上的相应的表
  记录;如果设置为SPACE,则锁定涉及所有的CLIENT。
    当逻辑锁设置失败后,一般会有两种例外。一个是EXCEPTION:FOREIGN_LOCK,意思是已经被锁定了;另一
  个是EXCEPTION:SYSTEM_FAILURE。
    有些情况下,程序中设置成功的逻辑锁会隐式的自己解锁。比如说程序结束发生的时候(MESSAGE TYPE为A
  或者X的时候),使用语句LEAVE PROGRAM,LEAVE TO TRANSACTION,或者在命令行输入/n回车以后。
    在程序的结束可以用DEQUEUE FUNCTION MODULE来解锁(当然如果你不写这个,程序结束的时候也会自动的
  解锁),这个时候,系统会自动从LOCK TABLE把相应的记录删除。使用DEQUEUE FUNCTION MODULE来解锁的
  时候,不会产生EXCEPTION。要解开你在程序中创建的所有的逻辑锁,可以用FM:DEQUEUE_ALL.
   
四、上锁的一般步骤
    先上锁,上锁成功之后,从数据库取数据,然后更改数据,接着更新到数据库,最后解锁。按照这个步骤,才
  能保证更改完全运行在锁的保护机制下。










SAP ABAP 加锁和解锁
http://blog.iyunv.com/heng0757/article/details/8028868
具体操作步骤:

1. 使用TCODE:SE11,选择最后一项[加锁对象],输入对象名称(注意一定要以字母‘E’开头,这是SAP内部规定的,如EZ_FI_CSTM_001)

2. 输入名称后,按新增,进入界面后输入要加锁的Table名,及加锁类型(E:专用,累计;S:共享;X:专用,不累计)。

保存后,系统会自动产生两个函数: ENQUEUE_EZ_FI_CSTM_001(加锁)和 DEQUEUE_EZ_FI_CSTM_001(解锁)。

3.然后在更改记录前调用加锁函数对记录进行锁定,在修改完成或退出修改后一定要对记录进行解锁。


   DSC0000.png

  
  输入锁定表:
   DSC0001.png

  
  输入锁定表的字段:
   DSC0002.png

  
  
  然后在程序里调用:
  PERFORM frm_unlock_0100 USING p_inv p_cntr p_doc_ty.

  
  *&---------------------------------------------------------------------*
*&      Form  FRM_UNLOCK_0100
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_P_INV  text
*      -->P_P_CNTR  text
*      -->P_P_DOC_TY  text
*----------------------------------------------------------------------*
FORM frm_unlock_0100  USING    p_inv
                               p_cntr
                               p_doc_ty.
  CALL FUNCTION 'DEQUEUE_EZ_FI_CSTM_001'
    EXPORTING
*     MODE_ZTBL_FI_CSTM_001 = 'E'
*     MANDT                 = SY-MANDT
      invoice               = p_inv
      contract              = p_cntr
      doc_type              = p_doc_ty
*     X_INVOICE             = ' '
*     X_CONTRACT            = ' '
*     X_DOC_TYPE            = ' '
*     _SCOPE                = '3'
*     _SYNCHRON             = ' '
*     _COLLECT              = ' '
    .
ENDFORM.                    " FRM_UNLOCK_0100

  
  
  
  参考自动生成的函数:
  
  FUNCTION DEQUEUE_EZ_FI_CSTM_001.
*"--------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(MODE_ZTBL_FI_CSTM_001) TYPE  ENQMODE DEFAULT 'E'
*"     VALUE(MANDT) TYPE  ZTBL_FI_CSTM_001-MANDT DEFAULT SY-MANDT
*"     VALUE(INVOICE) TYPE  ZTBL_FI_CSTM_001-INVOICE OPTIONAL
*"     VALUE(CONTRACT) TYPE  ZTBL_FI_CSTM_001-CONTRACT OPTIONAL
*"     VALUE(DOC_TYPE) TYPE  ZTBL_FI_CSTM_001-DOC_TYPE OPTIONAL
*"     VALUE(X_INVOICE) DEFAULT SPACE
*"     VALUE(X_CONTRACT) DEFAULT SPACE
*"     VALUE(X_DOC_TYPE) DEFAULT SPACE
*"     VALUE(_SCOPE) DEFAULT '3'
*"     VALUE(_SYNCHRON) DEFAULT SPACE
*"     VALUE(_COLLECT) TYPE  DDENQCOLL DEFAULT ' '
*"--------------------------------------------------------------------
* 为锁定对象 EZ_FI_CSTM_001 生成功能模块
* 请不要修改或复制该功能模块
* 参阅 ABAP 帮助中有关 SAP 锁定的内容
* 对关键字“ENQUEUE”

DATA: __seqta_tab TYPE SEQTA OCCURS 01 WITH HEADER LINE,
      __scope TYPE DDENQSCOPE,
      __synchron TYPE DDENQSYNC.
__synchron = _synchron.
__scope = _scope.

DATA: BEGIN OF %a_ZTBL_FI_CSTM_001,
*       锁定表格 ZTBL_FI_CSTM_001 的函数
            MANDT TYPE ZTBL_FI_CSTM_001-MANDT,
            INVOICE TYPE ZTBL_FI_CSTM_001-INVOICE,
            CONTRACT TYPE ZTBL_FI_CSTM_001-CONTRACT,
            DOC_TYPE TYPE ZTBL_FI_CSTM_001-DOC_TYPE,
      END OF %a_ZTBL_FI_CSTM_001.
* 锁定函数初始化:
CALL 'C_ENQ_WILDCARD' ID 'HEX0' FIELD %a_ZTBL_FI_CSTM_001.

* 锁定字段锁定参数的分配                     :
IF NOT MANDT IS INITIAL.
   MOVE MANDT TO:
        %a_ZTBL_FI_CSTM_001-MANDT.
ENDIF.
IF NOT INVOICE IS INITIAL OR
   NOT x_INVOICE IS INITIAL.
   MOVE INVOICE TO:
        %a_ZTBL_FI_CSTM_001-INVOICE.
ENDIF.
IF NOT CONTRACT IS INITIAL OR
   NOT x_CONTRACT IS INITIAL.
   MOVE CONTRACT TO:
        %a_ZTBL_FI_CSTM_001-CONTRACT.
ENDIF.
IF NOT DOC_TYPE IS INITIAL OR
   NOT x_DOC_TYPE IS INITIAL.
   MOVE DOC_TYPE TO:
        %a_ZTBL_FI_CSTM_001-DOC_TYPE.
ENDIF.

* 填写锁定表:
__seqta_tab-gname = 'ZTBL_FI_CSTM_001'.
__seqta_tab-gmode = MODE_ZTBL_FI_CSTM_001.
__seqta_tab-garg = %a_ZTBL_FI_CSTM_001.
APPEND __seqta_tab.

* 指定的锁定:
PERFORM send_enqueue(saplsena)
        TABLES __seqta_tab
        USING '2' __scope ' ' __synchron 'EZ_FI_CSTM_001' _collect.
ENDFUNCTION.

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-115358-1-1.html 上篇帖子: sap中的组织架构 下篇帖子: SAP PP Co12 Co11n 货物移动所用BADI之WORKORDER_GOODSMVT
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表