【ABAP系列】SAP 使用特殊的技術更新數據庫(ABAP)

公衆號: SAP Technical
本文做者: matinal
 

 

前言部分

你們能夠關注個人公衆號,公衆號裏的排版更好,閱讀更溫馨。html

正文部分

使用特殊的技術更新數據庫(ABAP)數據庫

一,過程
1,DIALOG程序得到用戶要更新的數據,並把它寫到一個特殊的LOG TABLE,表內的條目屬於同一個請求類型,包含了稍後將要寫到數據庫的數據。一個DIALOG程序能夠寫多條數據到LOG TABLE。寫進LOG TABLE裏的條目屬於同一個LUW,意思就是它們要麼都被執行,要麼都不被執行。
2,DIALOG程序關閉LUW(將LOG TABLE的條目打包),並通知系統基本程序有一個包的數據須要更新。
3,系統基本程序從LOG TABLE讀取這個LUW的須要更新的數據,並把這些數據提供給系統更新程序。
4,系統更新程序接受傳輸給它的數據,並更新數據庫。
5,若是更新程序運行成功,系統基本程序刪除這個LUW在LOG TABLE的全部數據;若是失敗,保持LOG TABLE的這些數據,並標記不成功。觸發更新程序的用戶會收到系統發的關於這個錯誤的E-MAIL。能夠用參數rdisp/vbmail(1發,0不發)來控制錯誤時是否發E-MAIL和rdisp/vb_mail_user_list($ACTUSER表明建立更新數據的用戶)來控制錯誤時發E-MAIL給誰。能夠用事務SM13來監控更新請求。
 
二,技術實現
更新程序必須用一個特殊的FM(update module)來實現。UPDATE MODULE和其餘的FM同樣,有傳輸參數的接口,可是隻能有IMPORTING和TABLES,而且類型只能用參考或者結構。EXPORTING和EXCEPTION參數在UPDATE MODULE裏是被忽略的。UPDATE MODULE裏包含實際的數據庫更新語句。
 
在DIALOG程序中,經過一個特別的FM,使用IN UPDATE TASK。如:
CALL FUNCTON 'F1' IN UPDATE TASK
     EXPORTING
        P1 = A
        P2 = B.
使用這樣寫法的FM不會當即執行,而是寫進LOG TABLE,做爲一個執行請求,一個SAP LUW下的更新請求存儲在同一個UPDATE KEY下。對一個SAP LUW來講UPDATE KEY是一個惟一的世界範圍的識別碼,意思就是一個SAP LUW的UPDATE KEY是惟一的,不會和另外的SAP LUW的UPDATE KEY重複。
 
只有當程序執行到COMMIT WORK的時候,纔會爲這些請求建立一個擡頭條目LOG HEADER,表示以上這些一樣UPDATE KEY的屬於同一個包,而後系統關閉這個LUW。當LOG HEADER建立之後,系統通知DISPATCHER有一個更新包已經準備好能夠處理了。
 
有些時候,你可能須要丟棄當前SAP LUW的全部changes(好比結束TCODE),可使用ROLLBACK WORK或者彈出一個A類型的MESSAGE,這兩個語句均可以有如下的效果:
-刪除寫到該點以前的全部的change requests
-刪除寫到該點以前全部的鎖
-丟棄當前DB LUW執行的changes
-丟棄全部使用POC形式登記的subroutines
 
ROLLBACK WORK語句不會影響程序上下文,意思就是,全部的數據對象保持不變。UPDATE MODULE裏面不容許有顯示的ROLLBACK WORK或者COMMIT WORK語句。
 
若是更新失敗,屬於這個SAP LUW的LOG條目會標記成不正確,同時錯誤消息也會保存到日誌。能夠用SM13來檢查LOG條目。
 
若是在DIALOG程序裏爲更新技術設置了鎖,而且鎖的參數_scope = 2,那麼使用COMMIT WORK以後鎖會被傳遞到UPDATE TASK,這個時候在DIALOG程序中,鎖不能被訪問。
 
在UPDATE MODULE裏沒必要顯示的去釋放鎖,由於更新處理的最後階段,系統會自動釋放這些鎖。當UPDATE TASK有錯誤發生的時候,也會自動釋放鎖。
 
若是UPDATE MODULE容許更新請求再次被處理,在處理的時候數據庫中的數據表跟失敗的時候可能不同,並且也沒有鎖保護了,由於錯誤產生的時候,鎖自動被釋放了。
 
舉個例子,若是一個憑證沒有成功更新到數據庫是由於數據庫的表空間溢出,這個時候比較適合再次處理。
 
三,更新的模式
1,異步模式
在這個模式下,DIALOG程序和UPDATE程序各自運行。DIALOG程序寫請求到LOG TABLE,用一個COMMIT WORK來關閉LUW。UPDATE程序被COMMIT觸發並開始運行來處理這些請求,DIALOG程序繼續運行,不會等待UPDATE程序結束。UPDATE程序在特殊的UPDATE WORK PROCESS中運行。
 
當數據庫更新花費比較長的時間,用戶DIALOG須要較少的響應時間,異步更新顯得比較重要。在DIALOG處理中,異步更新是標準的技術,意思就是DIALOG程序通常會採起異步更新方式。
 
能夠用VBLOG這個簇表來實現LOG TABLE,或者用透明表VBHDR,VBMOD,VBDATA,VBERROR來替代它。
 
2,同步模式
能夠用COMMIT WORK AND WAIT語句來觸發一個同步更新,DIALOG程序要等待UPDATE程序結束再進行下一步的處理。
 
若是後續處理或者DIALOG程序的結束須要依靠更新的結果,這個時候要用同步模式。能夠用SY-SUBRC來檢查同步更新的執行狀況,在程序等待UPDATE程序執行的過程當中,DIALOG程序的DIALOG WORK PROCESS被釋放,當更新結束以後,系統從新爲DIALOG程序分配一個新的空閒的DIALOG WORK PROCESS作下一步的處理。
 
3,本地模式
使用SET UPDATE TASK LOCAL語句來使用UPDATE MODULE在本地執行,一樣的用COMMIT WORK來關閉SAP LUW,更新會在同一個DIALOG WORK PROCESS中進行,DIALOG程序等待更新完成(同步)。當LOCAL UPDATE完成以後,會提交一個顯示的DB COMMIT,DIALOG程序也得以繼續執行。
 
若是更新執行有錯誤,而且其中一個UPDATE MODULE發出一個終止程序的MESSAGE,系統會執行一個自動的DB ROLLBACK來丟棄這個SAP LUW全部的改變,而且DIALOG程序會終止,並彈出一個程序終止信息。
 
LOCAL UPDATE模式中,更新請求不會寫到VBLOG表中,而是在MAIN MEMORY中,由於沒有IO的訪問,其速度要比同步和異步模式的快一點。LOCAL UPDATE只適合批量模式。
 
SET UPDATE TASK LOCAL工做到遇到COMMIT WORK語句,意思就是COMMIT WORK執行以後,SET UPDATE TASK LOCAL再也不有效。
 
四,UPDATE MODULE的類型(V1&V2)
FUNCTION MODULE的processing type有三種,NORMAL FUCNTION MODULE,REMOTE-CAPABLE MODULE和UPDATE MODULE。每種下面又包含4種分類,當即啓動,當即啓動(不可重啓),延遲啓動,collective run.前2種屬於V1類型,後兩種屬於V2類型。
 
UPDATE MODULE的類型決定了其處理的模式。全部的DIALOG程序裏的V1請求都會在單獨的DB LUW裏執行。只有當V1執行成功以後纔會處理V2請求,V2也會在單獨的LUWS裏執行。
 
V2類型的UPDATE MODULE處理的DB CHANGES通常都是緊接着V1的CHANGES(MAIN CHANGES)以後進行的。
 
V1類型的UPDATE MODULE分可從新啓動或不可從新啓動的兩種。V2類型的當發生錯誤的時候老是能夠從新啓動,再次處理。
 
V2類型的COLLECTIVE RUN是SAP內部使用。相應的V2請求並非在V1執行以後直接執行,而僅僅是在程序RSM13005被調用以後才執行。
 
V1請求都是由V1類型的UPDATE MODULE來建立的,對於同步異步模式來講,V1類型的UPDATE MODULE都會把請求建立到VBLOG這個TABLE,對於本地更新模式來講,V1請求是在MAIN MEMORY中建立的。V2類型的請求老是建立到VBLOG表中。
 
V1請求都會在一個V1類型的UPDATE WORK PROCESS(UPD)做爲一個單獨的DB LUW來處理。若是V1更新成功,系統會刪除V1的請求和全部在V1更新任務上的鎖,並設置一個DB COMMIT,而後觸發V2更新。
 
V2請求也是在一個V2類型的UPDATE WORK PROCESS(UPD2)做爲一個單獨的DB LUW來處理。若是SAP系統沒有設置V2類型的UPDATE WORK PROCESS,則V2請求會在一個V1類型的UPDATE WORK PROCESS裏進行處理。若是V2請求處理成功,將會從VBLOG刪除相關的請求,並設置一個DB COMMIT。V2請求通常都會運行在沒有鎖的狀況下,由於這些鎖在V1完成以後就被刪除掉了。所以,V2更新老是運行在沒有SAP LOCKS的狀況下。
 
若是V1 UPDATE MODULE用一個終止消息終止了V1更新,那麼V1更新任務上的鎖講被刪除,數據庫將ROLLBACK,一個E-MAIL會發送給建立這個LUW的用戶,而且V1請求在VBLOG表中被標記爲不正確。V2更新也就不會被觸發。
 
固然若是V2 UPDATE MODULE終止了V2更新,一樣的,數據庫ROLLBACK,屬於這個SAP LUW的V2更新都不會執行,V2請求在VBLOG表中被標記爲不正確。
 
DIALOG程序用_SCOPE = 2建立的鎖會被傳遞到V1更新任務中,在V1更新的結束,無論V1更新是否成功或者終止,都會把這些鎖自動刪除。所以,在DIALOG程序中不能顯式的刪除這些鎖(太早),或者在UPDATE MODULE裏刪除(不必)。異步

相關文章
相關標籤/搜索