【轉載】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
版權宣告:本文為博主原創文章,轉載請附上博文連結!