使用特殊的技術更新資料庫(ABAP)

liushijun_12發表於2009-06-25
文章來自:http://blog.chinaunix.net/u2/66669/showart_1790914.html
一,過程
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裡刪除(沒必要)。

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

相關文章