2012-04-09 89 views
0

在COBOL批處理程序中,性能方面有哪些更好?批處理DB2執行COMMIT/ROLLBACK和ROLLBACK以SAVEPOINT

隨着承諾:

IF SW-NEW-TRANSACT 
    EXEC SQL 
     COMMIT 
    END-EXEC 
END-IF. 
PERFORM SOMETHING 
    THRU SOMETHING-EXIT. 
IF SW-ERROR 
    EXEC SQL 
     ROLLBACK 
    END-EXEC 
END-IF. 

隨着同步點:

IF SW-NEW-TRANSACT 
    EXEC SQL 
     SAVEPOINT NAMEPOINT ON ROLLBACK RETAIN CURSORS 
    END-EXEC 
END-IF. 
PERFORM SOMETHING 
    THRU SOMETHING-EXIT. 
IF SW-ERROR 
    EXEC SQL 
     ROLLBACK TO SAVEPOINT NAMEPOINT 
    END-EXEC 
END-IF. 

回答

4

SAVEPOINT和COMMIT不可互換。

的處理總是在某個時候提交或回滾數據庫工作。 COMMIT是 採取之間交易(完成工作單位之間)。 COMMIT可能會在每次交易之後進行,或者在批次處理中通常會在多次交易之後執行 。一個COMMIT 永遠不會被中間交易(這打敗了UNIT OF WORK概念)。

保存點通常取並可能釋放內工作的單個單元。在完成 一個工作單元后,應始終釋放SAVEPOINT。他們總是在COMMIT上發佈。

目的保存點的 是允許局部退出從工作單元內。當一個進程開始於一系列共同的數據庫插入/更新的數據庫插入/更新後面跟着一個進程分支,在此進程可能會執行一些更新,然後才能確定備用進程 分支應該已經執行。 SAVEPOINT允許退出「盲巷」分支,然後繼續使用備用分支,同時保留常見的「前期」工作。如果沒有一個SAVEPOINT,回退一個「死衚衕」的可能需要大量數據 緩衝事務(複雜的處理)中或從所述交易的帶有某種標誌 的開始的回滾和重新做指示替代方法分支需要遵循。所有這些導致複雜的應用程序邏輯。 ROLLBACK TO SAVEPOINT有幾個優點。 它可以保留「前期」的工作,節省完成的成本。它可以挽回整個交易。回滾可能比原始插入/更新「更昂貴」,並且可能跨越多個事務(取決於提交頻率)。 最後,當數據庫工作可以通過ROLLBACK TO SAVEPOINT有選擇地「撤消」時,過程複雜度通常會降低。

SAVEPOINT如何被用來提高批處理程序的效率?如果您的交易使用自我誘導回滾從「盲巷」處理中恢復 ,那麼SAVEPOINT可能是一個巨大的好處。同樣,如果內部處理邏輯由於需要避免爲類似的「退出」需求執行數據庫更新而變得複雜,則可以使用SAVEPOINT將該過程重構爲 ,這是比較簡單並且可能更高效的。除了這些因素外,SAVEPOINT不會以積極的方式影響性能 。

一些人聲稱在批處理程序中COMMIT頻率較高會降低性能。因此,提交頻率越低,性能越好。調整COMMIT頻率不是微不足道的。提交頻率越低,保存的數據庫資源越長,因此誘發數據庫超時的可能性越大。遭遇數據庫超時通常會導致 進程回滾。回滾是非常昂貴的操作。 ROLLBACK對數據庫管理系統本身非常重要,您的交易需要在重新啓動後第二次重新應用所有更新。降低提交頻率最終可能會讓你付出更多的代價。謹防!

編輯

憑經驗:提交有成本。回滾有更高的成本。

由於數據錯誤,設備故障和程序異常(所有這些應該很少見),折扣回滾 ,大多數回滾是由於進程間資源爭用造成的 超時造成的。提交更少的提交會增加數據庫爭用。提交更少的提交可能會提高性能。技巧 的目的是要找出由於爭用造成的回滾成本沒有進行加權所獲得的性能。有 是影響這個 - 很可能是動態的大量因素。我的整體建議是尋找其他地方 以提高性能 - 調整提交頻率(超時不是問題)通常是低迴報投資。

其他更富有成效的方式,提高批量性能與通常包括:

  • 提高通過負載分擔paralleslism和運行同一任務的多個圖像
  • 分析DB/2綁定計劃和optomizing訪問路徑
  • 剖析批處理程序的行爲並重構消耗最多資源的那些部分
+0

因此,這是每個案件的具體決定,並沒有一般的指導方針,對嗎? – user823959 2012-04-10 16:27:41

+0

@ user823959請參閱編輯... – NealB 2012-04-10 17:05:50

1

這不是一個性能問題都沒有。

您承諾,當你完成一個工作單元,不管工作單元,意味着你的應用程序。通常,這意味着你已經完成了一個完整的交易。在批處理世界中,您需要在1,000到2,000個事務之後進行提交,因此您不會將所有時間花費在COMMITing上。該數量取決於在ROLLBACK事件中可以重新運行多少事務。

,當你遇到了某種錯誤你ROLLBACK,一個數據庫錯誤或應用程序錯誤。

SAVEPOINT當你處理工作的一個複雜的單位,要保存你沒有考慮一個完整的提交做了什麼。換句話說,您將採取一個或多個SAVEPOINT,然後最後進行COMMIT。

+0

對於您的答案,在我看來,COMMIT比SAV更昂貴EPOINT,這是正確的嗎? 如果是這樣,你有任何文件? 我想弄清楚如何減少執行復雜操作的批處理的CPU負載,並對每500個操作執行COMMIT,但只應回滾操作出錯。 – user823959 2012-04-09 22:35:43

+0

SAVEPOINT是部分COMMIT。在ROLLBACK上,您將回滾到上次提交,而不是最後的保存點。您可以回滾到最後一個保存點,但這是一個特殊的ROLLBACK命令,而不是一般的回滾。我會嘗試增加你的COMMIT計數到2,000,看看是否足夠減少處理時間。它不會影響CPU利用率。 – 2012-04-10 13:29:24

+0

爲什麼不影響CPU利用率? – user823959 2012-04-10 16:28:28