2011-03-07 264 views
1

我已經看到一些存儲過程包含事務中的所有內容。SQL Server事務日誌截斷/收縮

begin transaction 
    update 
     table 
    set 
     column c = (column a * column b) 
commit 

這是管理事務日誌的正確方法嗎?我已經嘗試了一些存儲過程,但它看起來像日誌剛剛失控。在運行具有多個更新/插入/更改語句的存儲過程時管理事務日誌的最佳方式是什麼?

任何幫助,非常感謝。

回答

4

無論查詢是隱式包裝在事務語句還是恢復模型中,都會記錄SQL事務。根據恢復模式,事務將保留在日誌中(完全恢復模式)或被截斷(簡單恢復模式)。無論截斷日誌的模式如何,都不會縮小文件大小。

管理日誌通常不是在您的應用程序中的SQL查詢中處理的,而是通常在DBA任務中處理的。

交易被存儲以允許在失敗的情況下恢復。自上次備份以來,您可以逐步完成事務以在該時間點重新創建數據。簡單恢復模式不允許這樣做,因爲事務在成功執行後立即被截斷(COMMIT)。

備份後,日誌通常會被截斷和收縮。您可以創建SQL維護作業來管理它。

2

該日誌與您在查詢中有多少顯式TRANSACTION沒有直接關係。 It's related to your recovery model.明確的TRANSACTION語句只是使用日誌來回滾或根據請求提交。

此外,如果沒有COMMITROLLBACK,您的代碼將會出現BEGIN TRANSACTION錯誤。

+0

謝謝,我只注意到我輸入'結束'而不是'提交'。 – divided 2011-03-07 19:42:00

2

你不需要在事務中包裝這個。它正在運行一個語句,以便它成功或失敗。

如果您正在更新第二個表,並且需要同時保持數據一致,那麼您可能需要考慮這種方法。

但是..事務日誌文件的大小將增長,直到備份爲止。如果數據庫很小,您可能希望將數據庫恢復選項設置爲簡單,並且每晚只備份整個數據庫,這也會截斷事務日誌文件。

+0

除了將恢復設置爲簡單意味着您可能會失敗中丟失數據。更適合大多數應用程序開始備份事務日誌。我們每15分鐘就會做一次,因爲我們無法承擔損失更多數據的公司。 – HLGEM 2011-03-07 19:44:04

+0

@divided,只是爲了說清楚,備份數據庫不會備份事務日誌,您需要單獨的事務日誌備份。 – HLGEM 2011-03-07 19:45:20

+0

你當然是對的。我打算繼續解釋,但感受到打字速度更快的壓力。達斯汀的回答可能是最完整的,這就是我投票的原因。然而,並不是所有的開發人員都有DBA管理數據庫的豪華 – 2011-03-07 19:48:15