COMMIT WORK & ROLLBACK WORK(轉載)

COMMIT WORK & ROLLBACK WORK

1. COMMIT WORK 語句執行許多與任務的同步執行有關的功能。
      ROLLBACK WORK語句「取消」任務同步執行的全部請求。
COMMIT WORK 語句進行下列處理:
• 執行全部由PERFORM ON COMMIT 請求的FORM 例程。
按優先級的升序執行這些例程,順序由 PERFORM 語句的LEVEL 參數指定。
• 若是請求,觸發全部更新任務功能模塊。
• 若是請求,觸發全部後臺任務功能模塊。
• 觸發數據庫提交(依次釋放數據庫鎖定)。
• 清空反轉日誌。
反轉日誌包含應用更改前的表格快照。執行反轉時,該快照用來將表格復位到原值。
• 關閉全部打開的數據庫光標。
• 將全部TEMSE 對象寫入永久性文件或數據庫。
TEMSE文件是因爲性能緣由在執行事務期間緩存的臨時序列文件。TEMSE文件的示例有假脫機對象或做業日誌。
• 將時間片計數器(用於訪問工做進程)復位到0。
系統中的時間片計數器限制工做進程中程序運行的時間量。若是程序經常超過期間片限制,則能夠使用COMMIT WORK爲程序得到更多時間。
可是,要達此目的,必須很容易將處理分爲更小單元(所有或沒有操做)。而後能夠在每一個單元以後插入COMMIT WORK 語句。固然處理單元邏輯上必須獨立,由於在發生錯誤時,不能取消前面的單元中所提交的更新。
ROLLBACK WORK「拋棄」當前事務的全部更新:
• 拋棄全部之前用PERFORM ON COMMIT 登陸的FORM例程
• 在更新任務隊列中將全部之前請求的更新任務功能標記爲錯誤
• 拋棄全部之前請求的後臺任務功能
• 從緩衝存儲中刪除全部TEMSE對象(臨時 連續文件,如假脫機對象和做業日誌)
• 觸發數據庫反轉操做(依次釋放全部數據庫鎖定)
• 關閉全部打開的數據庫光標
2. 如下狀況需使用使用COMMIT和ROLLBACK語句。
     1) 經過INSERT、UPDATE和MODIFY語句對數據庫進行更新事務後。
     2) 執行BAPI處理後。通常使用BAPI函數BAPI_TRANSACTION_COMMIT(內含COMMIT語句) 。
3. 若是要保證數據庫中當前所做的更改當即被確認,那麼就必須使用COMMIT WORK 語句結束LUW。
     COMMIT WORK 在程序代碼中標記了 LUW(幾個做業聯繫在一塊兒造成做業的邏輯單元) 結束並啓動更新任務。在COMMIT WORK 語句之後,對數據庫所做的全部更改都不能再取消。可是,若是在LUW 中出現了錯誤,就必須取消已經執行的部分。這意味着當前沒有任何插入的行能永久地保存在數據庫中。要撤銷當前LUW 對數據庫的更改,請使用ROLLBACK WORK,它將取消前一次數據庫提交後的全部更改。
4. COMMIT WORK [AND WAIT(同步)].
     若是使用AND WAIT選項,那麼在程序繼續執行之前,它要等到更新任務的結束。若是更新是成功的,SY-SUBRC 就設置爲0。若是 SY-SUBRC 返回一個非零值,就沒有成功的存儲所做的更改。
ROLLBACK WORK.
若是對更改的取消是成功的,SY-SUBRC 就設置爲0。若是 SY-SUBRC 返回一個非零值,就沒有成功地取消所做的更改
5. COMMIT WORK 和 COMMIT WORK AND WAIT 區別
首先說明一點:更新是異步的,更新是由SAP中UPD1和UPD2兩個進程執行的,關於這兩個進程各負責什麼再說明一下
UPD1先執行,主要是用於數據庫表的更新,好比說寫表
UPD2後執行,主要是用於一些數據的收集統計等的更新,好比說爲BW收集一下數據等等
同時這個是能夠在SM13看到的,若是看到日誌中UPD1成功,UPD2失敗,若有BW的取數,那確定會丟數據的。
因此說COMMIT WORK是異步的,爲了使其同步,全部就有了COMMIT WORK AND WAIT.
對於COMMIT WORK AND WAIT 來講,是能夠判斷是否更新成功的,SY-SUBRC NE 0就是有問題的。
上面是最簡單的區別,再有:
  因爲系統中COMMIT WORK的數量是有限的,好比說咱們系統是4000個,同時只能提交4000個更新進程,對於COMMIT WORK來講,執行完就釋放了,能夠爲後面的COMMIT WLRK繼續使用;而對於COMMIT WORK AND WAIT是要執行完才釋放的,因此對於沒有必要同步更新的,也儘快使用異步,使得資源獲得釋放。
相關文章
相關標籤/搜索