2011-05-01 65 views
1

我有一個用C#.net 2.0,sql 2005編寫的系統,其中業務層和數據訪問層已經創建並使用MSDTC事務。連接創建和打開,關閉等都寫在數據訪問層的每種方法。使用TransactionScope的不需要的促銷

我正在轉向一個新的系統,它重新使用舊的業務和數據訪問層,並在其自己的業務層和數據訪問層中提供新的功能。

我希望在LTM發生每次轉換並注意升級到MSDTC。

如果我在業務層使用TransactionScope編寫內部調用多個DAC方法的事務,事務將被提升爲DTC。通過使用新類,我可以在事務範圍開始之前通過在業務層中打開和關閉連接來處理此問題,但是對於舊的書寫類,我可以做些什麼。 .Net 4.0中有沒有辦法處理正在升級的轉換範圍? 我使用WCF的新服務和.net 4.0的新系統。

回答

2

默認情況下新打開的連接會加入當前事務。如果事務在多個連接(資源)上運行,它將自動提升爲MSDTC。您可以通過在連接字符串中指定Enlist=false來強制SQL連接不加入當前事務。

如果每個舊類都使用自己的連接,則應該使用MSDTC,否則由業務邏輯執行的多個數據更改將不會處於一個事務中。例如:

using (var scope = new TransactionScope()) 
{ 
    DalA.DoSomething(); 
    DalB.DoSomething(); 
    scope.Complete(); 
} 

DalA和DalB都使用自己的連接。如果你使用Enlist=false,他們將不會進行交易,如果DalB.DoSomething失敗,它不會回滾DalA.DoSomething。

正確的方法是使用MSDTC或重寫舊的類以使用一個連接。本地事務僅適用於一個資源(連接)。