2010-02-21 67 views

回答

6

數據庫中的每個更新都會首先向包含更改描述的日誌寫入條目。例如。如果將列值從A更新爲B,則日誌將包含更新的記錄,如下所示:在表T中,C列從A更改爲B,記錄的密鑰K通過ID爲I的事務進行記錄。如果回滾事務時,引擎將開始掃描日誌以查找事務完成的工作記錄,並撤銷該工作:當它找到從A更新爲B的記錄時,會將該值更改回A.插入將被撤消通過刪除插入的行。通過插回行刪除將被撤消。這在Transaction Log Logical ArchitectureWrite-Ahead Transaction Log中有描述。

這是高層次的解釋,確切的內部細節如何發生這種情況,對於外行人而言是沒有文件證明的,不受您的檢查或更改。

+0

因此,關於無證的正確,我有一個母馬試圖解碼LOP_MODIFY_COLUMNS :) – Andrew 2010-02-22 10:34:58

3

在它是怎麼做的,所有的事務中的數據修改存儲在事務日誌中,有額外的空間還保留在日誌中撤銷記錄中,因爲它具有回滾事件術語。 每個事務日誌都有足夠的信息來反轉已做的更改,以便它可以在需要時撤消更改。 (除了重播它們在DR方案)

如果我們舉一個簡單的刪除操作爲例(因爲我已經decoded that here作爲日誌內容的一個示例)被刪除存儲在事務日誌條目中記錄的LOP_DELETE_ROWS和一些不平凡的努力,你可以解碼和演示整個行是在日誌條目。

如果要回滾事務,將使用日誌中保留的撤消空間,並重新插入該行。撤銷空間保留的原因是爲了確保事務日誌不能在事務處理完成時被填滿,從而無法完成或回滾空間。

+0

感謝Andrew的幫助。 如何從日誌表中獲取存儲的數據? – 2010-02-21 14:06:03

+2

在查看它的過程中,select * from :: fn_dblog(null,null)就實際解釋而言,你真的無法做到 - 它在任何實際的形式中都不是人類可讀的。有第三方工具可以讀取日誌,或者您可以閱讀奇怪的條目以獲得「興趣/理解」的視角,但是在該級別上沒有任何關於該主題的文檔 – Andrew 2010-02-21 14:08:16