我有一個帶有兩個表的SQL Server 2008數據庫,一個使用TransactionScope
的.NET 4.5應用程序,其中有兩個查詢到數據庫,每個使用它們自己的單獨連接一個單個連接字符串。MSDTC事務被提升爲在事務處理範圍之外執行的查詢上分佈式
此代碼工作正常:
internal static void Main(string[] args)
{
string connStr = string.Format(
"Data Source={0};Initial Catalog={1};" +
"Integrated Security=True", "My DB Server", "My Database");
using (var scope = new TransactionScope())
{
string query1 = "(actual query not relevant)";
var ds = GetSqlServerDataSet(query1, connStr);
string query2 = "(actual query not relevant)";
var ds1 = GetSqlServerDataSet(query2, connStr);
scope.Complete();
}
}
private static System.Data.DataSet GetSqlServerDataSet(string usingQuery,
string usingConnectionString,
params System.Data.SqlClient.SqlParameter[] withParameters)
{
using (var ds = new System.Data.DataSet())
using (var conn = new System.Data.SqlClient.SqlConnection(usingConnectionString))
using (var command = new System.Data.SqlClient.SqlCommand(usingQuery, conn))
{
command.Parameters.AddRange(withParameters);
using (var adapter = new System.Data.SqlClient.SqlDataAdapter(command))
{
adapter.Fill(ds);
}
return ds;
}
}
現在,如果我扔範圍測試回滾內一個例外,那就是當東西變得陌生。我正在使用我編寫的引用類庫來持久化關於數據庫異常的信息。這是相同類型的設置 - 相同的SQL Server,.NET版本,相同的ADO.NET代碼等。它只是寫入不同的數據庫。
下面是它如何工作的:我已經添加了這個方法我的應用程序:
private static void HandleUnhandledException(Object sender, System.UnhandledExceptionEventArgs e)
{
ExceptionHandling.Core.Main.ProcessException((Exception) e.ExceptionObject);
Environment.Exit(0);
}
,我已經加入這一行我Main
方法的頂部:
AppDomain.CurrentDomain.UnhandledException += HandleUnhandledException;
現在,當我拋出一個例外,例如throw new Exception("blah");
在Main
的底部,就在scope.Complete()
之前,它會自動跳轉到HandleUnhandledException
,剩下的就像我上面描述的那樣。這導致System.Transactions.TransactionManagerCommunicationException
與消息:爲分佈式事務管理器(MSDTC)
網絡訪問已被禁用 。請使用組件服務管理 工具爲MSDTC配置安全 配置中的DTC以啓用網絡訪問。
這發生在我的課程庫中致電Connection.Open()
。
那麼這裏發生了什麼?我知道錯誤告訴了我什麼,我知道how to fix it。我的問題是這是爲什麼發生在第一位?我認爲using
聲明會在處理我的HandleUnhandledException
方法之前處理回滾事務,因此這裏不應涉及兩個事務。或者我錯了?
你確定引用的類庫本身不需要MSDTC嗎? –
絕對。我一直在用我的項目十年。 –
它是什麼類型的應用程序?控制檯,WPF,Webb? –