2008-09-11 66 views
12

我明白,以一種模糊的方式,常規的ACID事務是如何工作的。您在數據庫上執行某些工作時,只有在設置了某種提交標誌之後才能確認工作。提交部分基於一些基礎假設(如單個磁盤塊寫入是原子的)。如果發生災難性錯誤,您可以在恢復階段清除未提交的數據。分佈式事務如何工作(如MSDTC)?

分佈式事務如何工作?在一些MS文檔中,我已經讀過,你可以以某種方式在數據庫和文件系統之間執行事務(除其他外)。

此技術可以(也可能)用於安裝程序,您希望程序完全安裝或完全不存在。您只需在安裝程序開始時開始一個事務。接下來,您可以連接到註冊表和文件系統,進行定義安裝的更改。作業完成後,只需提交,或者在出於某種原因安裝失敗的情況下回滾。這個神奇的分佈式事務協調器會自動清理註冊表和文件系統。

怎麼可能以這種方式處理兩個不同的系統呢?在我看來,總是有可能讓系統處於不一致的狀態,即文件系統已經提交了更改並且註冊表沒有更改。我認爲在MSDTC中甚至可以在整個網絡上執行交易。

我已閱讀http://blogs.msdn.com/florinlazar/archive/2004/03/04/84199.aspx,但感覺只是解釋的開始,步驟4應該大大擴展。

編輯:從我收集的http://en.wikipedia.org/wiki/Distributed_transaction可以通過兩階段提交(http://en.wikipedia.org/wiki/Two-phase_commit)完成。讀完這些之後,我仍然沒有完全理解這個方法,似乎這些步驟之間有很大的誤差空間。

+0

這裏有*很大的錯誤空間。特別是,它依賴「COMMIT PREPARED」始終工作。現實不同。 – 2014-06-20 03:24:03

回答

3

關於「第4步」:

事務管理協調 與資源管理器,以確保 所有的成功,如果做執行請求的 工作或不工作,從而 保持ACID屬性。

這當然要求所有參與者提供適當的接口和(無錯誤)實現。界面看起來有點模糊:

​​

事務管理器在提交時詢問所有參與者是否願意提交事務。如果參與者能夠在所有允許的錯誤條件(驗證,系統錯誤等)下提交此事務,則他們只能聲明這一點。在所有參與者聲稱提交交易的能力之後,經理向所有參與者發送Commit()消息。如果任何參與者提出錯誤或超時,則整個事務中止並且個別成員被回退。

該協議要求參與者在聲明其提交能力之前記錄了他們的整個交易內容。當然這必須在特殊的本地事務日誌結構中才能從各種故障中恢復。

+3

如果你有參與者A和B,A會被提交併返回成功,那麼B會被提交併返回失敗,但在A可以被回滾之前網絡會丟失?另一種情況是網絡故障可能會阻止B提交。 – BCS 2009-04-28 22:35:37