1. 程式人生 > >【轉載】SAP ABAP LOCK 鎖物件 資料庫鎖

【轉載】SAP ABAP LOCK 鎖物件 資料庫鎖

1.概要

鎖物件是在SE11中可以建立/變更/查詢的ABAP物件,起著同期化資料的作用。如下圖1-1所示,當“程式1”
修改資料時使“程式2”不能訪問資料。因為這時的“程式1”給相應資料加了鎖。                                                                          

                                                                                       圖1-1

鎖執行的機制提供兩個主要的功能。

1.當程式讀取資料變更後向其他程式傳達已經結束的訊息。
2.防止程式讀取正在被別的程式修改中的資料。
要設定鎖的前提是在ABAP資料字典中應該存在此鎖物件。當啟用鎖物件時自動生成加鎖/解鎖用的下列兩個函式。

      ENQUEUE <LockObjectname>
      DEQUEUE <LockObjectname>
如下圖1-2所示,給表加鎖的步驟
      1.要求鎖

   在程式邀請給資料加鎖。

      2.進入鎖

   把需要加鎖的資料輸入到鎖表中。

      3.設定鎖

   當程式要求時才給表加鎖。加鎖狀態會保持到程式中遇到解鎖或者程式結束。所有鎖都要在程式內部進行加鎖,因此應該都要在程式內部進行解鎖。當程式訪問已經加鎖的資料時該邀請資訊會儲存到鎖表中。


    4.訪問資料


只有在設定了鎖的程式中才能訪問該資料。
在上圖中,給表1建立了鎖物件,則自動生成加/解鎖此表的函式。
鎖定模式的解釋:
E-獨佔鎖:只允許一個使用者訪問表。對其他程式的獨佔鎖及共享鎖不起作用。
S-共享鎖:多個使用者可以同時讀取資料。但是,倘若有個使用者在修改資料,則其他就無法再訪問資料了。
X-獨佔鎖但不是累計鎖:獨佔鎖可以在多個不同事務碼內申請解鎖。但是在相應事務碼中只能申請一次,此外不接受其他任何鎖申請。
2.建立鎖物件
在下面的例子中我用到了兩個表“ZEMP”和“ZEMPCERT”,其中"ZEMPCERT"是外來鍵表。

1.在T-CODE:SE11 ABAP字典中建立。(鎖物件名字一定要以E開頭)
   記得勾選“允許RFC”,則可以從其他系統中呼叫


2.點選 表格  標籤頁,在名稱中輸入需要加鎖的表名。單擊  新增劑可以追加鎖物件需要的表。單擊‘新增’則彈出由外部鍵相連的表list.

3.選擇需要加鎖的引數。

建立鎖物件後啟用,則自動生成下列兩個函式。當刪除鎖物件時也會被一起刪除。
                                                   EZQUEUE_ZEMP
                                                   UNQUEUE_ZEMP
   3.鎖程式例項
1.建立程式後單擊Pattern按鈕,然後輸入所建立的鎖函式,會自動生成程式碼。

程式碼示例
REPORT zhzytest005 MESSAGE-ID zpp.
CALL FUNCTION 'ENQUEUE_EZ_ZEMP'
     EXPORTING
          mode_zemp      = 'E'
          mode_zempcert  = 'E'
          mandt          = sy-mandt
          emp_no         = '01'
*          =
          x_emp_no       = 'X'
*          x_certid       = ' '
*          _scope         = '2'
*          _wait          = ' '
*          _collect       = ' '
     EXCEPTIONS
          foreign_lock   = 1
          system_failure = 2
          OTHERS         = 3.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  MESSAGE s689 WITH 'data is locked'.
  STOP.
ENDIF.
 
WRITE 'haha'.

可以嘗試一下效果,先在本程式執行,然後不要關閉,再重新開啟一個視窗,再執行本程式,會發現彈出提示‘data is locked’

4.鎖的引數屬性

1.initial value 引數
以‘X_<field>’開始的引數會設定欄位的初始值。若設定成X_EMP_NO = 'X',則當遇到與EMP_NO的初始值相同值才會設定鎖物件。EMP_NO的初始值只需要在表字段中選擇INITIAL VALUE選項。當沒有設定X時,則會用Default Value指定初始值。在上圖中,X_EMP_NO被設定為Default Value = SPACE。這意味著引數EMP-NO中沒有指定值時會被當成SPACE來設定鎖物件。

2.Passing Lock引數
正在執行的鎖是當呼叫解鎖函式DEQUEUE或者程式結束時才被解除。遇到資訊型別A和X時或使用者在命令視窗中輸入了“/n”時也被解除。但,當事務碼正在執行UPDATE時結果不一樣了,這種情況檢查_SCORE判斷是否可以解除鎖。

_SCOPR = 1: 在UPDATE程式中無法連線鎖。當結束事務碼時鎖也一起結束。
_SCOPE = 2:在UPDATE程式中可以連線鎖。在UPDATE程式中負責解鎖。
_SCOPE = 3:UPDATE程式可以連線鎖。呼叫程式與UPDATE程式通過相互互動進行解鎖。
3.控制鎖引數

_COLLECT引數決定是直接執行加/解鎖還是通過Lock Container執行。

initial value:加/解鎖請求資訊直接傳送到鎖伺服器上。
X:加/解鎖請求首先會儲存到本地Lock Container中。
其他
CALL FUNCTION 'ENQUEUE_READ'
* EXPORTING
*   GCLIENT                     = SY-MANDT
*   GNAME                       = ' '
*   GARG                        = ' '
*   GUNAME                      = SY-UNAME
*   LOCAL                       = ' '
* IMPORTING
*   NUMBER                      =
*   SUBRC                       =
  TABLES
    enq                         =
* EXCEPTIONS
*   COMMUNICATION_FAILURE       = 1
*   SYSTEM_FAILURE              = 2
*   OTHERS                      = 3


  ENQUEUE_READ函式

如多個使用者同時修改一個訂單,在SAP系統中經常會發生修改同一個資料的情況。
所以可以利用ENQUEUE_READ函式可以檢查該函式是否被加鎖。


--------------------- 
作者:熙來攘往 
來源:CSDN 
原文:https://blog.csdn.net/HJackyua/article/details/73613327 
版權宣告:本文為博主原創文章,轉載請附上博文連結!