SAP 資料更新的觸發

SAPmatinal發表於2020-01-12

SAP 應用系統架構



        應用層執行著DIALOG程式,每個DIALOG程式繫結一個資料庫程式,DIALOG程式與GUI進行通訊,每次GUI嚮應用伺服器傳送請求時都會透過dispatcher服務為每個GUI的請求分配一個Dialog程式.一個程式執行時,GUI與Dialog進行需要多次通訊,每次通訊使用的Dialog程式不一定相同,在Dialog程式將控制權轉給前臺的GUI時,由於Dialog程式同資料庫程式繫結,會觸發一個隱式資料庫提交(COMMIT WORK),如果在Dialog程式發生A型別錯誤,則觸發隱式的資料庫回滾(Rollback)

SAP LUW

SAP LUW是DB LUW的一個增強,受體系結構限制,SAP程式每次螢幕切換時(控制權從後臺DIALOG程式轉移到前臺GUI的Session),都會觸發一個隱式的資料庫提交,一個程式在執行是會產生多個DB 的LUW,這樣無法做到全部提交或全部回滾,在某些業務場景下,這種事務的提交機制不足以保證資料的一致性,為此有有了SAP LUW機制.SAP LUW是一種延遲執行的技術,它將本來需要執行的程式塊,記錄下來.記錄的位置在記憶體或DB Table中,如perform on commit 會記錄到記憶體中,update Funciton module即可以記錄到記憶體也可以記錄到VBMOD 和VBMOD表中.系統在執行COMMIT WORK的時候會查詢記錄,真正執行需要執行的程式碼,COMMIT WORK一般在最後一個螢幕執行,這樣就實現了將跨螢幕的資料更新邏輯繫結到一個DB LUW中,實現複雜情況資料更新的一致性

SAP LUW的繫結方式

CALL FUNCTION...IN UPDATE TASK,

該種方式需要Funciton型別為Update Module型別,同時在呼叫時使用IN UPDATE TASK引數.

在程式呼叫 Update Module進行更新時分為本地和非本地

非本地方式:

註冊的更新函式記錄在VBMOD 和VBMOD表中,COMMIT WORK 時更新操作在UPDATE程式中執行,此時呼叫程式不等待被呼叫函式的返回,使用的為非同步方式.如果使用COMMIT WORK AND WAIT,此時呼叫程式等待被呼叫函式的返回,使用的為同步方式.

本地方式

在呼叫函式前需要執行 SET UPDATE TASK LOCAL. 這樣所有在該語句後使用CALL FUNCTION...IN UPDATE TASK註冊的更新函式不會記錄到資料庫中,而是記錄在記憶體中,在Commit work之後,會從記憶體取得待執行的函式,在同一個Dialog程式中執行資料的更新,本地方式更新採用的是同步方式,即使在Commit work後指定了and wait引數,仍然是同步執行.

在使用COMMIT WORK之後 SET UPDATE TASK LOCAL的效果會被清除掉,如果COMMIT WORK後註冊的更新函式仍然需要採用本地方式,需要再執行一次 SET UPDATE TASK LOCAL語句.

優缺點對比

本地方式不將待執行的更新函式寫到資料表中,減少了I/O操作,效率上較高,但由於採用的是同步方式,程式需等待更新結果,使用者互動時的會感覺程式執行較慢

非本地方式會將更新結果記錄到資料表中,可以透過SM13檢視更新情況,同時由於可以進行非同步更新,使用者互動時感覺會比較快

CALL FUNCTION... IN BACKGROUND TASK DESTINATION,

是一種對RFC函式進行事務繫結的方式


PERFORM ... ON COMMIT

將待執行的程式塊註冊到記憶體中,可以使用LEVEL引數指定優先順序,優先順序按升序進行排列,較小的會優先執行.

使用ON COMMIT引數註冊的subroutine,如果同樣名字的subroutine被註冊了多次,在COMMIT WORK時只執行一次,IN UPDATE TASK方式執行的Funciton沒有這個限制

繫結方式的執行順序

PERFORM ON COMMIT 會優先執行,如果中斷,CALL FUNCTION... IN BACKGROUND TASK和CALL FUNCTION...IN UPDATE TASK, DESTINATION 將不會執行,可以保證資料的全部提交和全部回滾

建議不要混合使用CALL FUNCTION... IN BACKGROUND TASK和CALL FUNCTION...IN UPDATE TASK,因為一個是針對本地資料進行的更新,一個是遠端資料,從技術上猜測,跨資料庫的提交與回滾很難實現,故同時使用這兩種方式可能會帶來資料不一致的問題,除非本地和遠端資料不需要保持資料的一致

V1 & V2 Update



圖例說明

Immediate start 表示V1方式,更新出錯後,可以在SM13裡重新執行

Immediate start -no restrat possible V1方式,出錯後不可以在SM13裡重新執行,有些更新脫離具體程式後再執行可能會帶來資料的不一致,可以考慮使用這種方式

Start delayed V2方式 V1方式更新完成後觸發,

Collective run V2方式 需使用Collective(RSM13005)程式手動或JOB方式執行,

更新函式分為V1和V2

V1優先順序高於V2,V2被設計為依賴於V1,適合執行需要在V1完成後進行的操作,

V1更新使用V1程式處理,V1程式名字一般為UPD,V1程式繫結獨立的資料庫程式.在V1程式中排程的更新函式如果更新失敗,回滾,不進行V2操作.成功則提交更改到資料庫,同時刪除所有的SAP鎖

V2更新使用V2程式處理,如果沒有配置V2程式則共用V1程式,V2程式名字為UP2,V2更新在獨立DB LUW中,V2更新回滾後不會影響到V1更新提交的資料,由於V1更新結束後會刪除SAP的鎖,所以V2更新是在沒有邏輯鎖的情況下進行的,V2更新出錯後可以在SM13中重新執行

SAP Locks

SAP 的鎖是一種邏輯鎖,透過加鎖函式和解鎖函式進行處理

鎖型別

S 共享鎖 讀鎖,可以累加


 


 Shared lock


 


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


E 獨佔鎖 寫鎖 程式內可以累加


 


 Exclusive lock


 


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


X 排他鎖 寫鎖 不可以累加

慎用S鎖,S鎖的累加特性會造成鎖無法徹底釋放,造成其他程式無法寫入,E鎖可以保證只加一次鎖


 Exclusive but not cumulative lock


Exclusive locks can be requested by the same transaction more than once and handled successively, but an exclusive but not cumulative lock can only be requested once by a given transaction. All other lock requests are rejected.


鎖物件


透過鎖物件可以生成加鎖和解鎖函式

其中scope 引數 1 表示程式內,有效 2 表示 update module 內有效 3 全部

_wait 表示如果物件已經被鎖定,是否等待後再嘗試加鎖,最大的等待時間 有系統引數 ENQUE/DELAY_MAX控制

_COLLECT 參數列示是否收集後進行統一提交,COLLECT 是一種快取與批處理方法,即如果指定了Collect,加鎖資訊會放到Lock Container 中,Lock Container實際上是一個funciton Group控制的記憶體區域,如果程式中加了很多鎖,鎖資訊會先放到記憶體中,這樣可以減少對SAP鎖管理系統訪問,若使Lock Container中的鎖生效,需執行FLUSH_ENQUEUE 這個Funciton,將鎖資訊更新到鎖管理系統中,此時加鎖操作生效,使用函式 RESET_ENQUEUE可以清除Lock Container中的鎖資訊

釋放鎖

呼叫DEQUEUE函式

如果程式更新用到到V1 Update時,在commit work是會刪除所有的鎖

程式中止

rollback

為什麼需要使用SAP Lock

SAP Lock是一種邏輯鎖,相對於DB Lock,是一種輕量級的鎖,DB Lock一旦發現不能加鎖會進行延遲等待,使用SAP Lock 一定程度上可以減少對DB Lock的佔用,避免死鎖,同時合理使用SAP Lock可以保證資料的一致性

其他

select for update 是在DB層次上加的鎖

參考

SM66檢視活動程式,如果有V1和V2更新,可以看到UPD和UP2程式

SM13檢視出錯或未執行完的V1和V2更新


  TCODE、相關表、多表鎖


       1)TCODE:可以透過se11來檢視和建立鎖物件,鎖物件建立完畢之後,統會自動建立兩個FM,ENQUEUE_<鎖物件名>和DEQUEUE_<鎖物件名>,分別用來鎖定和解鎖。


       2)相關表:


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


      DD25T:


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


      DD27S:合計(檢視,MC物件,鎖定物件)欄位;


      3)多表鎖


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


 鎖的生命週期


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


 鎖的作用範圍


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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69901557/viewspace-2673038/,如需轉載,請註明出處,否則將追究法律責任。

相關文章