2010-03-08 28 views
4

有人能告訴我TransactionScope如何保證跨多個數據庫的數據完整性的原則嗎?我想它首先將命令發送到數據庫,然後等待數據庫響應,然後向它們發送消息以應用先前發送的命令。但是,當發送這些應用消息時突然停止執行時,我們仍然可能會得到一個應用該命令的數據庫和一個沒有應用該命令的數據庫。任何人都可以對此有所瞭解嗎?TransactionScope如何保證跨多個數據庫的數據完整性?

編輯:

我想林問的是什麼,我可以依靠的TransactionScope在停電或突然停機的情況下寫入多個數據庫時,以保證數據的完整性。

謝謝,巴斯

實施例:

using(var scope=new TransactionScope()) 
    { 
     using (var context = new FirstEntities()) 
     { 
      context.AddToSomethingSet(new Something()); 
      context.SaveChanges(); 
     } 

     using (var context = new SecondEntities()) 
     { 
      context.AddToSomethingElseSet(new SomethingElse()); 
      context.SaveChanges(); 
     } 

     scope.Complete(); 
    } 
+0

順便說一句,你正在你的代碼中進行序列化的隔離事務。 – Henrik 2012-01-20 09:25:30

回答

2

對於分佈式事務,實際上可能會發生數據庫變得不一致的情況。你說:

在某些時候,兩個數據庫都必須 被告知應用其更改。讓 說有 告訴第一個數據庫應用,然後 數據庫不同步後有一個停電。還是我 錯過了什麼?

你不是。我認爲這被稱爲將軍問題。它可以被證明是不可預防的。然而,失敗的窗口非常小。

+0

就我瞭解維基百科關於將軍問題的文章而言,假設一條消息及其確認已成功交換(又名tx-log中編寫的任意步驟),2PC可避免不一致。如果你的網絡在一個提交後出現故障,另一個尚未提交,那麼第一個將成功準備,另一個(否則它們將不會被告知提交),第一個數據庫可以安全地承擔第二個數據庫在它重新聯機時將會提交。 – Henrik 2010-03-26 11:07:58

+0

只有當您認爲只有有限的信息可能會丟失時,纔會出現此情況。如果所有的信息在最壞的時候都可能丟失,你仍然會失去信心。 – usr 2011-02-08 22:53:36

6

它,如果它檢測到它使用每個範圍作爲2相的一部分提交多個數據庫提升到分佈式事務協調器(MSDTC)。 Each scope votes to commit,因此我們得到了ACID屬性,但分佈在數據庫中。它也可以與TxF,TxR集成。你應該能夠以你描述的方式使用它。

這兩個數據庫是一致的,因爲在MTC下運行的分佈式COM +事務已附加到它們的數據庫事務中。

如果一個數據庫投票(例如通過執行(:TransactionScope).Commit()),「it」會告訴DTC它投票提交。當所有的數據庫都完成後,他們有一個更改列表。至於數據庫事務現在不會發生死鎖或與其他事務衝突(例如,通過預先佔用一個事務的公平算法),每個數據庫的所有操作都在事務日誌中。如果在還沒有提交一個數據庫時已經完成了對另一個數據庫的提交時系統斷電,那麼已經在事務日誌中記錄了所有資源都已投票提交的情況,因此不存在提交失敗的邏輯暗示。因此,下一次無法啓動的數據庫啓動時,它將完成處於這個不確定狀態的事務。

+0

感謝您的回答,但我仍然有點困惑。在某些時候,兩個數據庫都必須被告知應用其更改。假設在告訴第一個數據庫應用後出現停電,那麼數據庫不同步。或者我錯過了什麼? – 2010-03-08 12:26:28

+0

我的意思是單獨的兩個數據庫都是有效的,但它們不再彼此同步。 – 2010-03-08 12:27:54

+0

我在回答中添加了更多內容。請參閱維基百科鏈接瞭解更多鏈接和資源。簡而言之;它可以在數據庫不同步的情況下工作(它們也在內部使用2PC),如果你使用TransactionScopes,那麼你應該沒有什麼可擔心的。儘管如此,還有更多的細節可以應用到這個答案中,例如磁盤寫入實際上並不是與數據庫系統假設相反的原子,以及您應該使用哪種類型的硬盤驅動器以便儘可能多地訪問(http:/ /forums.bit-tech.net/showthread.php?t=146156) – Henrik 2010-03-08 13:16:02

相關問題