2010-01-07 90 views
2

我的代碼是這樣的.NET TransactionScope的異常

try 
{ 
    using (TransactionScope iScope = new TransactionScope()) 
    { 
     try 
     { 
      isInsertSuccess = InsertProfile(account); 
     } 
     catch (Exception ex) 
     { 
      throw; 
     } 

     if (isInsertSuccess) 
     { 
      iScope.Complete(); 
      retValue = true; 
     } 
    } 
} 
catch (TransactionAbortedException tax) 
{ 
    throw; 
} 
catch (Exception ex) 
{ 
    throw; 
} 

現在發生什麼事是,即使我值爲TRUE隨機出現TransactionAbortedException異常,但數據得到的插入/更新數據庫。

任何想法出了什麼問題?

+0

你爲什麼要聲明三個名爲'rethrow'的變量而不對它們做任何事情?另外,爲什麼你有兩個完全相同的'catch'塊用於不同類型的異常? – SLaks 2010-01-07 14:10:56

+0

不是現在,但會使用字母 – Posto 2010-01-07 14:12:44

+0

哪個值是「真」? – SLaks 2010-01-07 14:19:36

回答

9

由於TransactionAbortedException文件說,

此異常也拋出時試圖 提交事務和 事務中止。

這就是爲什麼你看到的例外,甚至調用Transaction.Complete之後:Complete方法是不一樣的東西Commit

調用此方法[TransactionScope.Complete]不保證 提交交易。這是 只是通知你的情況

直到退出using語句的事務未提交的 事務管理的一種方式:詳見CommittableTransaction.Commit文檔。此時,參與交易的任何行爲可能投票中止交易,您將獲得TransactionAbortedException

要調試潛在的問題,您需要分析異常詳細信息和堆棧跟蹤。正如馬克在評論中指出的那樣,這可能是死鎖或與其他數據庫進程的交互造成的。

+1

+1好的解釋,特別指出Complete只是一個投票。 – 2010-01-07 15:19:57