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. 
    
上鎖的一般步驟 
    先上鎖,上鎖成功之后,從數據庫取數據,然后更改數據,接着更新到數據庫,最后解鎖。按照這個步驟,才能保證更改完全運行在鎖的保護機制下。 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM