首先說明一點:更新是異步的,更新是由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是要執行完才釋放的,所以對於沒有必要同步更新的,也盡快使用異步,使得資源得到釋放。
有時,在繼 續處理前需 要確認對數 據庫表所作 的更改。另 一方面,在 永久存儲之 前可能需要 取消一些對 數據庫表所作的更改。要確認對數 據庫表的更 改,請使用 COMMIT WORK 語句。要在 永久存儲之 前取消一些 更改,請使 用 ROLLBACK WORK 語句。這些語句在 對話編程( 即 SAP 事務、數據 庫事務、打 開或關閉屏 幕等等,有 關對話編程 的概述,參 見編寫 ABAP/4 事務)中起着 十分重要的 作用。在本 主題中,您 將了解到如 何在 ABAP/4 報表中使用 COMMIT WORK 和 ROLLBACK WORK( 參見編寫 ABAP/4 報表)。
在 ABAP/4 報表中,可 能有幾個作 業聯系在一 起形成作業 的邏輯單元 (LUW) 。通常,可 能要處理 LUW 中的所有動作,或什么 也不要處理 。假設 LUW 中包含了將 五行插入到 數據庫表中 的進程。如 果事務成功 ,所有五行 都將存儲在 數據庫表中 (這包含一 個更新請求 和一個數據 庫事務)。 在顯示新屏 幕之前,數 據庫事務將 自動結束( ABAP/4 報表的結束 )。在 ABAP/4 報表中不能 以任何方式 影響該進程,如果要保證 數據庫中當 前所作的更 改立即被確 認,那么, 就必須使用 COMMIT WORK 語句結束 LUW。COMMIT WORK 在程序代碼 中標記了 LUW 結束並啟動 更新任務( 參見 COMMIT WORK 處理 )。在 COMMIT WORK 語句以后, 對數據庫所 作的所有更 改都不能再 取消。
但是,如果 在 LUW 中出現了錯 誤,就必須 取消已經執 行的部分。 這意味着當 前沒有任何 插入的行能 永久地保存 在數據庫中 。要撤銷當 前 LUW 對數據庫的 更改,請使 用 ROLLBACK WORK, 它將取消前 一次數據庫 提交后的所 有更改。
要確認對數 據庫表的更 改並使它們 不能再取消 ,請按如下 格式使用 COMMIT WORK 語句:
語法
COMMIT WORK [AND WAIT].
如果使用 AND WAIT 選項,那么 在程序繼續 執行以前, 它要等到更 新任務的結 束。如果更 新是成功的 ,SY-SUBRC
就設置為 0。如果 SY-SUBRC 返回一個非 零值,就沒 有成功的存 儲所作的更 改。
要在保存之 前取消對數 據庫表所作 的更改,請 按下列形式 使用 ROLLBACK WORK 語句:
語法
ROLLBACK WORK.
如果對更改 的取消是成 功的,SY-SUBRC 就設置為 0。如果 SY-SUBRC 返回一個非 零值,就沒 有成功地取 消所作的更 改。
使用 COMMIT WORK 和 ROLLBACK WORK 語句的結果 是將丟失所 有的數據庫 光標。因此 ,在 SELECT 循環中或在 處理 SQL 語句之前不 允許使用這 些語句。
關於 COMMIT WORK 和 ROLLBACK WORK 的詳細信息 ,請參考關 鍵字文檔。
TABLES SPFLI. DATA FLAG. SPFLI-CARRID = 'UA'. SPFLI-CONNID = '0011'. SPFLI-CITYFROM = ............ INSERT SPFLI. IF SY-SUBRC <> 0. FLAG = 'X'. ENDIF. SPFLI-CARRID = 'LH'. SPFLI-CONNID = '1245'. SPFLI-CITYFROM = ............ INSERT SPFLI. IF SY-SUBRC <> 0. FLAG = 'X'. ENDIF. SPFLI-CARRID = 'AA'. SPFLI-CONNID = '4574'. SPFLI-CITYFROM = ............ INSERT SPFLI. IF SY-SUBRC <> 0. FLAG = 'X'. ENDIF. ................ ................ IF FLAG = 'X'. ROLLBACK WORK. ELSE. COMMIT WORK. ENDIF.
在該示例中 ,LUW 將在 SPFLI 中插入一系 列特定的行 。在每個 INSERT 語句后,程 序將檢查操 作是否成功 ,或檢查具 有相應的主 碼字段(CARRID 和 CONNID) 的行是否已 經在 SPFLI 中存在。稍 后,程序將 FLAG 設置為“X” 。如果對於 每一個 INSERT 語句,SY-SUBRC 沒有設置為 0,那么最 后一個 IF 語句中的 ROLLBACK WORK 語句將取消 對數據庫的 所有更改。 否則,用 COMMIT WORK 語句確認這 些更改。