使用特殊的技术更新数据库(ABAP)
生活随笔
收集整理的這篇文章主要介紹了
使用特殊的技术更新数据库(ABAP)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
使用特殊的技術更新數(shù)據(jù)庫(ABAP)
一,過程 1,DIALOG程序獲得用戶要更新的數(shù)據(jù),并把它寫到一個特殊的LOG TABLE,表內的條目屬于同一個請求類型,包含了稍后將要寫到數(shù)據(jù)庫的數(shù)據(jù)。一個DIALOG程序可以寫多條數(shù)據(jù)到LOG TABLE。寫進LOG TABLE里的條目屬于同一個LUW,意思就是它們要么都被執(zhí)行,要么都不被執(zhí)行。 2,DIALOG程序關閉LUW(將LOG TABLE的條目打包),并通知系統(tǒng)基本程序有一個包的數(shù)據(jù)需要更新。 3,系統(tǒng)基本程序從LOG TABLE讀取這個LUW的需要更新的數(shù)據(jù),并把這些數(shù)據(jù)提供給系統(tǒng)更新程序。 4,系統(tǒng)更新程序接受傳輸給它的數(shù)據(jù),并更新數(shù)據(jù)庫。 5,如果更新程序運行成功,系統(tǒng)基本程序刪除這個LUW在LOG TABLE的所有數(shù)據(jù);如果失敗,保持LOG TABLE的這些數(shù)據(jù),并標記不成功。觸發(fā)更新程序的用戶會收到系統(tǒng)發(fā)的關于這個錯誤的E-MAIL。可以用參數(shù)rdisp/vbmail(1發(fā),0不發(fā))來控制錯誤時是否發(fā)E-MAIL和rdisp/vb_mail_user_list($ACTUSER代表創(chuàng)建更新數(shù)據(jù)的用戶)來控制錯誤時發(fā)E-MAIL給誰。可以用事務SM13來監(jiān)控更新請求。 ? 二,技術實現(xiàn) 更新程序必須用一個特殊的FM(update module)來實現(xiàn)。UPDATE MODULE和其他的FM一樣,有傳輸參數(shù)的接口,但是只能有IMPORTING和TABLES,并且類型只能用參考或者結構。EXPORTING和EXCEPTION參數(shù)在UPDATE MODULE里是被忽略的。UPDATE MODULE里包含實際的數(shù)據(jù)庫更新語句。 ? 在DIALOG程序中,通過一個特別的FM,使用IN UPDATE TASK。如: CALL FUNCTON 'F1' IN UPDATE TASK ???? EXPORTING ????????P1 = A ????????P2 = B. 使用這樣寫法的FM不會立即執(zhí)行,而是寫進LOG TABLE,作為一個執(zhí)行請求,一個SAP LUW下的更新請求存儲在同一個UPDATE KEY下。對一個SAP LUW來說UPDATE KEY是一個唯一的世界范圍的識別碼,意思就是一個SAP LUW的UPDATE KEY是唯一的,不會和另外的SAP LUW的UPDATE KEY重復。 ? 只有當程序執(zhí)行到COMMIT WORK的時候,才會為這些請求創(chuàng)建一個抬頭條目LOG HEADER,表示以上這些同樣UPDATE KEY的屬于同一個包,然后系統(tǒng)關閉這個LUW。當LOG HEADER創(chuàng)建以后,系統(tǒng)通知DISPATCHER有一個更新包已經(jīng)準備好可以處理了。 ? 有些時候,你可能需要丟棄當前SAP LUW的所有changes(比如結束TCODE),可以使用ROLLBACK WORK或者彈出一個A類型的MESSAGE,這兩個語句都可以有以下的效果: -刪除寫到該點之前的所有的change requests -刪除寫到該點之前所有的鎖 -丟棄當前DB LUW執(zhí)行的changes -丟棄所有使用POC形式登記的subroutines ? ROLLBACK WORK語句不會影響程序上下文,意思就是,所有的數(shù)據(jù)對象保持不變。UPDATE MODULE里面不允許有顯示的ROLLBACK WORK或者COMMIT WORK語句。 ? 如果更新失敗,屬于這個SAP LUW的LOG條目會標記成不正確,同時錯誤消息也會保存到日志。可以用SM13來檢查LOG條目。 ? 如果在DIALOG程序里為更新技術設置了鎖,并且鎖的參數(shù)_scope = 2,那么使用COMMIT WORK之后鎖會被傳遞到UPDATE TASK,這個時候在DIALOG程序中,鎖不能被訪問。 ? 在UPDATE MODULE里不必顯示的去釋放鎖,因為更新處理的最后階段,系統(tǒng)會自動釋放這些鎖。當UPDATE TASK有錯誤發(fā)生的時候,也會自動釋放鎖。 ? 如果UPDATE MODULE允許更新請求再次被處理,在處理的時候數(shù)據(jù)庫中的數(shù)據(jù)表跟失敗的時候可能不一樣,而且也沒有鎖保護了,因為錯誤產(chǎn)生的時候,鎖自動被釋放了。 ? 舉個例子,如果一個憑證沒有成功更新到數(shù)據(jù)庫是因為數(shù)據(jù)庫的表空間溢出,這個時候比較適合再次處理。 ? 三,更新的模式 1,異步模式 在這個模式下,DIALOG程序和UPDATE程序各自運行。DIALOG程序寫請求到LOG TABLE,用一個COMMIT WORK來關閉LUW。UPDATE程序被COMMIT觸發(fā)并開始運行來處理這些請求,DIALOG程序繼續(xù)運行,不會等待UPDATE程序結束。UPDATE程序在特殊的UPDATE WORK PROCESS中運行。 ? 當數(shù)據(jù)庫更新花費比較長的時間,用戶DIALOG需要較少的響應時間,異步更新顯得比較重要。在DIALOG處理中,異步更新是標準的技術,意思就是DIALOG程序一般會采取異步更新方式。 ? 可以用VBLOG這個簇表來實現(xiàn)LOG TABLE,或者用透明表VBHDR,VBMOD,VBDATA,VBERROR來替代它。 ? 2,同步模式 可以用COMMIT WORK AND WAIT語句來觸發(fā)一個同步更新,DIALOG程序要等待UPDATE程序結束再進行下一步的處理。 ? 如果后續(xù)處理或者DIALOG程序的結束需要依靠更新的結果,這個時候要用同步模式。可以用SY-SUBRC來檢查同步更新的執(zhí)行情況,在程序等待UPDATE程序執(zhí)行的過程中,DIALOG程序的DIALOG WORK PROCESS被釋放,當更新結束之后,系統(tǒng)重新為DIALOG程序分配一個新的空閑的DIALOG WORK PROCESS做下一步的處理。 ? 3,本地模式 使用SET UPDATE TASK LOCAL語句來使用UPDATE MODULE在本地執(zhí)行,同樣的用COMMIT WORK來關閉SAP LUW,更新會在同一個DIALOG WORK PROCESS中進行,DIALOG程序等待更新完成(同步)。當LOCAL UPDATE完成之后,會提交一個顯示的DB COMMIT,DIALOG程序也得以繼續(xù)執(zhí)行。 ? 如果更新執(zhí)行有錯誤,并且其中一個UPDATE MODULE發(fā)出一個終止程序的MESSAGE,系統(tǒng)會執(zhí)行一個自動的DB ROLLBACK來丟棄這個SAP LUW所有的改變,并且DIALOG程序會終止,并彈出一個程序終止信息。 ? LOCAL UPDATE模式中,更新請求不會寫到VBLOG表中,而是在MAIN MEMORY中,因為沒有IO的訪問,其速度要比同步和異步模式的快一點。LOCAL UPDATE只適合批量模式。 ? SET UPDATE TASK LOCAL工作到遇到COMMIT WORK語句,意思就是COMMIT WORK執(zhí)行之后,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里執(zhí)行。只有當V1執(zhí)行成功之后才會處理V2請求,V2也會在單獨的LUWS里執(zhí)行。 ? V2類型的UPDATE MODULE處理的DB CHANGES一般都是緊接著V1的CHANGES(MAIN CHANGES)之后進行的。 ? V1類型的UPDATE MODULE分可重新啟動或不可重新啟動的兩種。V2類型的當發(fā)生錯誤的時候總是可以重新啟動,再次處理。 ? V2類型的COLLECTIVE RUN是SAP內部使用。相應的V2請求并不是在V1執(zhí)行之后直接執(zhí)行,而僅僅是在程序RSM13005被調用之后才執(zhí)行。 ? V1請求都是由V1類型的UPDATE MODULE來創(chuàng)建的,對于同步異步模式來說,V1類型的UPDATE MODULE都會把請求創(chuàng)建到VBLOG這個TABLE,對于本地更新模式來說,V1請求是在MAIN MEMORY中創(chuàng)建的。V2類型的請求總是創(chuàng)建到VBLOG表中。 ? V1請求都會在一個V1類型的UPDATE WORK PROCESS(UPD)作為一個單獨的DB LUW來處理。如果V1更新成功,系統(tǒng)會刪除V1的請求和所有在V1更新任務上的鎖,并設置一個DB COMMIT,然后觸發(fā)V2更新。 ? V2請求也是在一個V2類型的UPDATE WORK PROCESS(UPD2)作為一個單獨的DB LUW來處理。如果SAP系統(tǒng)沒有設置V2類型的UPDATE WORK PROCESS,則V2請求會在一個V1類型的UPDATE WORK PROCESS里進行處理。如果V2請求處理成功,將會從VBLOG刪除相關的請求,并設置一個DB COMMIT。V2請求一般都會運行在沒有鎖的情況下,因為這些鎖在V1完成之后就被刪除掉了。因此,V2更新總是運行在沒有SAP LOCKS的情況下。 ? 如果V1 UPDATE MODULE用一個終止消息終止了V1更新,那么V1更新任務上的鎖講被刪除,數(shù)據(jù)庫將ROLLBACK,一個E-MAIL會發(fā)送給創(chuàng)建這個LUW的用戶,并且V1請求在VBLOG表中被標記為不正確。V2更新也就不會被觸發(fā)。 ? 當然如果V2 UPDATE MODULE終止了V2更新,同樣的,數(shù)據(jù)庫ROLLBACK,屬于這個SAP LUW的V2更新都不會執(zhí)行,V2請求在VBLOG表中被標記為不正確。 ? DIALOG程序用_SCOPE = 2創(chuàng)建的鎖會被傳遞到V1更新任務中,在V1更新的結束,不管V1更新是否成功或者終止,都會把這些鎖自動刪除。因此,在DIALOG程序中不能顯式的刪除這些鎖(太早),或者在UPDATE MODULE里刪除(沒必要)。
總結
以上是生活随笔為你收集整理的使用特殊的技术更新数据库(ABAP)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 没钱还装逼,买二手车的都是什么人?
- 下一篇: 关于ABAP高级顾问应该掌握的技术