2015-01-21 60 views
3

我正在嘗試跨兩個查詢使用TransactionScope到不同的SQL Server實例(該事務被提升爲MSDTC)。我讓它在不使用任務的情況下同步工作,但無法在異步使用任務時使事務回滾。無法使用TransactionScope與任務

我已經隱藏了連接字符串到服務器和更新語句,但確保他們都連接和執行沒有問題的SQL。我有意將方法runTwo()中的SQL設置爲失敗並引發異常。

我使用.Net 4.5.2,其中包括枚舉TransactionScopeAsyncFlowOption.Enabled(在TransactionScope構造函數中),我認爲它應該處理跨線程的事務,但無法使其工作。

static void Main() 
     { 
      List<Task> tasks = new List<Task>(); 
      using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) 
      { 
       try 
       { 
        tasks.Add(Task.Run(() => runOne())); 
        tasks.Add(Task.Run(() => runTwo())); 

        Task.WhenAll(tasks); 

        //Complete the scope 
        scope.Complete(); 
       } 
       catch (Exception) 
       { 
        Transaction.Current.Rollback(); 
       } 
      } 
      Console.ReadLine(); 
     } 

     private static void runOne() 
     { 
      //Get the base SQL connection 
      using (SqlConnection conn = new SqlConnection("Data Source=SERVER1.....")) 
      { 
       conn.Open(); 

       SqlCommand command1 = new SqlCommand 
       { 
        CommandText = "Update .. Complete Successfully", 
        CommandType = CommandType.Text, 
        Connection = conn 
       }; 

       command1.ExecuteNonQuery(); 
      } 
     } 

     private static void runTwo() 
     { 
      using (
       SqlConnection conn = 
        new SqlConnection("Data Source=SERVER2...") 
       ) 
      { 
       conn.Open(); 

       SqlCommand command2 = new SqlCommand 
       { 
        CommandText = "Update .... Raises Exception", 
        CommandType = CommandType.Text, 
        Connection = conn 
       }; 

       //Execute the command 
       command2.ExecuteNonQuery(); 

      } 
     } 

回答

3

此:

Task.WhenAll(tasks); 

是你的問題。 Task.WhenAll返回等待,它不是上的方法調用。由於您使用不能等待一個控制檯應用程序,你就必須推遲到使用Task.WaitAll而不是將明確禁止,直到兩個請求完成,將通過AggregateException

try 
{ 
    Task.WaitAll(new[] { Task.Run(() => runOne()), 
         Task.Run(() => runTwo()) }); 
    scope.Complete(); 
} 
傳播任何異常
相關問題