SAP 鎖機制、sap鎖機制簡單理解 sm12


SAP 鎖機制、sap鎖機制簡單理解sm12

SAP鎖機制

一、SAP為什么要設置鎖:
1,保持數據的一致性
如果幾個用戶要訪問同樣的資源,需要找到一種同步訪問的方法去保持數據的一致性。比如說,在航班預訂系統中,需要檢查還有沒有空座位,當檢查的時候,你不想別人修改重要的數據(空座位的數量)。
2,僅僅用Database鎖是不夠的
數據庫管理系統物理鎖定了要修改的行記錄,其他用戶要等到數據庫鎖釋放才能訪問這個記錄。在SAP系統中,當一個新屏幕顯示的時候會釋放掉Database鎖,因為屏幕的改變會觸發一個隱式的DB COMMIT。如果數據是從好幾個屏幕收集來的話,而且在這段時間內這些數據會分別被鎖定,僅僅用Database鎖就不夠了。 SAP系統在應用服務器層面有一個全局的LOCK TABLE,可以用來設置邏輯鎖來鎖定相關的表條目,並有ENQUEUE工作進程來管理這些鎖。SAP鎖是一種邏輯意義上的鎖,有可能你鎖定的表條目在DATABASE上根本就不存在。

二、鎖對象和其對應的Function Module
在SE11里創建鎖對象,自定義的鎖對象都必須以EZ或者EY開頭來命名。一個鎖對象里只包含一個PRIMARYTABLE,可以包含若干個SECONDARY TABLE,鎖的模式有三種:E,S,X。LOCK PARAMETERS里填寫你要根據哪些字段來鎖定表條目。
模式E:當更改數據的時候設置為此模式。WriteLock(exclusive lock)
模式S:本身不需要更改數據,但是希望顯示的數據不被別人更改。Read Lock(Shared Locked)
模式X:和E類似,但是不允許累加,完全獨占。Enhancedwrite lock (exclusive lock without cumulating)
如果你在一個程序里成功對一個鎖對象加鎖之后,如果模式為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_<鎖對象名>,分別用來鎖定和解鎖。

SAP Provide three type of Lock objects.

• ReadLock(Shared Locked)

protects read access to an object. The readlock allows other transactions read access but not write access to

the locked area of the table

• WriteLock(exclusive lock)

protects write access to an object. Thewrite lock allows other transactions neither read nor write access to

the locked area of the table.

• Enhancedwrite lock (exclusive lock without cumulating)

works like a write lock except that theenhanced write lock also protects from further accesses from the

same transaction.

 

三、鎖定和解鎖
當用邏輯鎖來鎖定表條目的時候,系統會自動向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.


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

 

 

關於倉庫管理的錄屏程序涉及到mb1b之后做tr轉to,估計是tr表被SAP鎖機制給鎖定了,如果延遲 
時間不夠,就會報錯:TR正在被處理。 
我用FUNCTION 'DEQUEUE_ELLTBKE'解鎖之后,TR轉TO可以操作了,但是卻依然報錯。實在想不出 
原因。求助!~

Try adding a "commit work" in the middle of theprocess.

謝謝大蝦指點。小女子頓悟了。SAP鎖機制針對數據庫層和應用服務層都上鎖了,我用函數只是把 
應用服務層給解鎖了,數據庫層要用COMMIT WORK來解吧。

 

鎖定主要是基於數據庫的要求。很多表在數據庫層是不可見的,所以對於鎖的管理,要在SAP界面上來完成。鎖一種叫共享的鎖,一種叫排它的鎖。

事務代碼:SM12,共享下面有X的,是共享的鎖。是表明不許別人改,但是可以看。

排他的鎖,是不許別人看和修改。

缺省支持13000條鎖。鎖的資源在內存中的一個表locklist,如果都填滿的話,那就鎖定失敗,就不能更改,沒有鎖的資源了。

別人已經鎖定的情況下,自己的就不能鎖定了。

以上都是正常的鎖定。

還有一種情況是“死鎖”;die log,比如a用戶,b用戶都要用1-4進程,a用戶用1,2,b用戶用3,4,那么大家都占用自己的資源,都等待別人放開鎖。

盤點要把所有的用戶都鎖定住。

事務代碼:DB01,看死鎖。

鎖定要發送一個命令去鎖,還要發一個命令去解鎖。比如鎖掉了以后,機器就down了,或者網絡斷了,也就出現了鎖掉了,沒有解鎖。用事務代碼sm12,手工去刪除掉。

死鎖是對系統性能比較嚴重的一個問題。

鎖掉還有一種情況,就是有些動作是不能夠同時做的。

凡是更改數據庫,就一定會有鎖定。

 

耗時間:SD反沖,價格,ATP CHECK

MMPP,MRP RUN

CO:物料帳

 

來做lock是通過enqueue server的。如果是在應用服務器上的話,要通過message server來傳送到CI的。如果lock太多的話,內存表有預定義大小的,想辦法減少lock的數量(有一個技術叫“鎖升級”),想辦法增加lock table的大小(增大內存)。通常SAP是行鎖定,只鎖一行或者某些行。在數據庫,lock table也是有限的。鎖升級也就是用一個鎖,把這個表鎖掉。表鎖定有一個參數來控制的,當一個用戶鎖掉超過70%了,那就把這個表鎖定,可以減少鎖掉表的總數。

如果一個用戶發了一條命令,如果dialog突然斷掉,或者用戶退出,沒有人解鎖。那么就需要系統管理員來參與。事務代碼:SM12,看鎖定的時間,三個小時以上就可以查明原因。那么還有一個事務代碼,DB01,正常是NO lock.

也可以給用戶權限,可以刪除自己的lock。

 

 

sap鎖機制簡單理解

由於工作的需要,最近在研究業務系統數據並發控制問題,曾經寫過abap程序,記得sap里有個鎖對象,可以對表記錄進行鎖定操作,於是進行了相關了解,並在此基礎上設計了基於MC的鎖機制(有時間再獻上基於MC的鎖機制,供大家批判)。如果覺得下文所述,似曾相識,說明大家對sap所對象的理解已經超越我。

sap為了同步同時多個用戶操作同一數據,防止數據出現不一致性而采用了鎖機制。一般 sap會在操作數據前設置鎖,防止第二個用戶進行修改操作,當操作結束后系統會自動釋放鎖(當然程序也可以調用解鎖函數去解鎖)。

1、SAP鎖的類型

1)Exclusive lock

The locked data can be read orprocessed by one user only. A request for another exclusive lock or for ashared lock is rejected.

2)Shared lock

Several users can read the same dataat the same time, but as soon as a user edits the data, a second user can nolonger access this data. Requests for further shared locks are accepted, evenif they are issued by different users, but exclusive locks are rejected.

3)Exclusive but notcumulative lock

Exclusive locks can be requested bythe same transaction more than once and handled successively, but an exclusivebut not cumulative lock can only be requested once by a given transaction. Allother lock requests are rejected.

 

2、TCODE、相關表、多表鎖

1)TCODE:可以通過se11來查看和創建鎖對象,鎖對象創建完畢之后,統會自動創建兩個FM,ENQUEUE_<鎖對象名>和DEQUEUE_<鎖對象名>,分別用來鎖定和解鎖。

2)相關表:

DD25L:組合標題(方式,MC目標,鎖定目標)(紀錄了鎖主表);

DD25T:

DD26S:視圖的基本表和外來碼關系(紀錄了所有和鎖相關的表);

DD27S:合計(視圖,MC對象,鎖定對象)字段;

3)多表鎖

在SE11里創建鎖對象,自定義的鎖對象都必須以EZ或者EY開頭來命名。一個鎖對象里只包含一個PRIMARY TABLE,可以包含若干個SECONDARYTABLE。如多表鎖:EMEKKOE,主表:EKKO-->E 專用累積,從表:EKPO-->E專用累積。

 

3、鎖的生命周期

通常程序一運行就要對特殊記錄進行ENQUEUE處理,程序運行完畢之后進行DEQUEUE處理(不顯示處理的話,關閉該session的時候,sap會自動DEQUEUE,此處sap真N!)。

 

4、鎖的作用范圍

sap鎖僅對特定程序起作用,假設A程序改table1的第1條記錄,B程序也改table1的第1條記錄,A程序一運行就對table1的第1條記錄加鎖,B程序則未加鎖,則B程序仍可以改table1的第1條記錄內容。

 

 

se11的最后一個功能是建立鎖對象,例如對創建的數據庫表加鎖,命名可以是“E”+表名(這塊有的帳戶權限可能不夠建不了,找basis給權限吧)。
名字起好后點創建,輸入鎖對象短文本(描述),在tables選項中選擇要加鎖的表名,之后在下面的lock parameter中一般選擇“E”(專用,累積),設置好后,一個鎖對象就建好了,在lock parameter選項中,系統默認表的所有主鍵都是鎖參數。根據個人需要可以刪除不需要的參數
之后在程序中,調用CALL FUNCTION ‘ ENQUEUE_EZMATMOV ‘和CALL FUNCTION ‘ DEQUEUE_ EZMATMOV ‘兩函數在程序中加鎖和解鎖,第一個函數用於在程序操作數據庫之前上鎖,后一個是程序操作數據庫后將鎖釋放。代碼如下:
data: l_mqid like ZMM_MES_MATM_LOG-MQID,
l_sentti like ZMM_MES_MATM_LOG-SENTTI,
l_USERID like ZMM_MES_MATM_LOG-USERID,
l_BWART like ZMM_MES_MATM_LOG-BWART.
data: l_errmsg(255).
CALL FUNCTION ‘ENQUEUE_EZMATMOV’
EXPORTING
mode_zmm_mes_matm_log = ‘E’
mandt = sy-mandt
mqid = l_mqid
sentti = l_sentti
userid = l_userid
bwart = l_bwart
* x_mqid = ’ ’
* x_sentti = ’ ’
* x_userid = ’ ’
* x_bwart = ’ ’
_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
* into l_errmsg.
* write: / l_errmsg.
MESSAGE e001(z001) WITH ‘多個用戶不能同時對數據做操作處理!‘.
EXIT.
ENDIF.
select zpesinfnr….

CALL FUNCTION ‘ DEQUEUE_ EZMATMOV ‘
EXPORTING
mode_zpseinfnr = ‘E’
mandt =sy-mandt
.
附件是截圖

 

最后在SE37中可以去看系統已經幫我們自動生成的鎖定和解鎖的函數。詳細可以參考ENQUEUE_EZMATMOVDEQUEUE_EZORDCFM,所建的鎖定和解鎖的函數都放在叫/1BCDWBEN/ZEN0000的函數組中

 

SAP中鎖對象的刪除

 

在sap中當你打開一個transaction時,你想再打開另外一個一樣的transaction是不被允許的,因為有鎖對象的存在,但是也有辦法來刪除該鎖對象,使多個用戶對一個transaction進行操作

T-Code:SM12

 

 

代碼:

DATA: lt_enq_del TYPE STANDARD TABLE OF seqg3,
lt_enq_read TYPE STANDARD TABLE OF seqg7,
lw_enq_read TYPE seqg7,
lw_enq_del TYPE seqg3,
lv_subrc TYPE sy-subrc.

 

1. Read all the lock details in system
CALL FUNCTION 'ENQUE_READ2'
EXPORTING
gclient = sy-mandt
gname = ' '
guname = '*'
TABLES
enq = lt_enq_read.

2. We will search entry for table level lock for our table
LOOP AT lt_enq_read INTO lw_enq_read
WHERE gname EQ 'RSTABLE'
AND garg CS 'ZOPS_PROFILE'.

MOVE-CORRESPONDING lw_enq_read TO lw_enq_del.
APPEND lw_enq_del TO lt_enq_del.
ENDLOOP.

3.Delete table level lock entry for our table
CALL FUNCTION 'ENQUE_DELETE'
EXPORTING
check_upd_requests = 1
IMPORTING
subrc = lv_subrc
TABLES
enq = lt_enq_del.


免責聲明!

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



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