• SAP锁对象(lock object)


    ABAP里为了控制并发,保持数据一致性,用了锁对象(lock object)对于abaper来说使用起来非常方便,没有什么难度,很好的处理了并发的状况。下面先介绍如何使用.这里的锁对象是逻辑意义上的锁,可能你锁定的条目在表里根本不存在。 


    1.如何创建锁对象 

    创建锁对象很容易,TCODE:se11.选择最下面的lock object。如图: 

     
    自建的锁对象以EZ或者EY开头,新建完之后可以看到三个标签页。Attributes,Tables,Lock Parameter. 

    如果是接口对表进行操作,注意需要选上allow RFC.如图: 

     
    Tables标签下Primary Tables下两个输入项,name是表的名字,lock mode有三种模式,分别是S,E,X.含义如下: 

          S (Shared lock, read lock) 
          E (Exclusive lock, write lock) 
          X (eXclusive lock, extended write lock, cannot be cumulated) 
         模式E:当更改数据的时候设置为此模式。 
          模式S:本身不需要更改数据,但是希望显示的数据不被别人更改。 
          模式X:和E类似,但是不允许累加,完全独占。 


    如果我们使用一般情况下,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模式的不可以。 

     
    LOCK parameters里面默认的参数时表的主键,这样因为可以唯一的确定表的一行,通常情况下不用修改。 

    在激活之后,会产生两个function module,一个用来对对象进行锁定,另一个是释放对象。二者的名字都很有规律。 

    DEQUEUE_<lock object的名字>               释放对象 EZ9MISTP 的锁定 
         ENQUEUE_<lock object的名字>                对象 EZ9MISTP 要求的锁定 

    到时要使用的时候直接call function module即可。 

    上文地址::http://blog.csdn.net/donkey2004112103/archive/2009/04/28/4131496.aspx


    另外附上两个对表Lock的FM: 
    * testing the locking of tables... 
    data: 
      varkey like rstable-varkey. 

      varkey = sy-mandt. 

    * locking the tables............................ 
    call function 'ENQUEUE_E_TABLE' 
    exporting 
    *   MODE_RSTABLE         = 'E' 
       tabname              = 'MARA' 
       varkey               = varkey 
    *   X_TABNAME            = ' ' 
    *   X_VARKEY             = ' ' 
    *   _SCOPE               = '2' 
    *   _WAIT                = ' ' 
    *   _COLLECT             = 'X' 
    exceptions 
       foreign_lock         = 1 
       system_failure       = 2 
       others               = 3 
              . 
      case sy-subrc. 
        when 1. 
            message i184(bctrain) with 'Foreignlock'. 
        when 2. 
          message i184(bctrain) with 'system failure'. 
        when 0. 
          message i184(bctrain) with 'success'. 
            when others. 
            message i184(bctrain) with 'others'. 
      endcase. 




    * unlocking the table............... 

    call function 'DEQUEUE_E_TABLE' 
       exporting 
    *     MODE_RSTABLE       = 'E' 
         tabname            = 'MARA' 
         varkey             =  varkey 
    *     X_TABNAME          = ' ' 
    *     X_VARKEY           = ' ' 
    *     _SCOPE             = '3' 
    *     _SYNCHRON          = ' ' 
    *     _COLLECT           = ' ' 
                . 

    锁定和解锁 
        当用逻辑锁来锁定表条目的时候,系统会自动向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. 
        
    上锁的一般步骤 
        先上锁,上锁成功之后,从数据库取数据,然后更改数据,接着更新到数据库,最后解锁。按照这个步骤,才能保证更改完全运行在锁的保护机制下。 
     
     
  • 相关阅读:
    【Android】ContentValues的用法
    【Android】Android处理Home键方法小结
    【Android】spannableStringBuilder
    【Android】Android 4.0 Launcher2源码分析——启动过程分析
    【Android】android文件的写入与读取---简单的文本读写context.openFileInput() context.openFileOutput()
    【Android】Android取消EditText自动获取焦点
    android在view.requestFocus(0)返回false的解决办法
    Android中创建倒影效果的工具类
    android布局layout中的一些属性
    android中巧妙更改spinner、AutoCompleteTextView分割线的颜色值(spinner AutoCompleteTextView divider color)
  • 原文地址:https://www.cnblogs.com/shilz/p/6419994.html
Copyright © 2020-2023  润新知