2009-08-27 90 views
6

我想創建一個事務,在子事務中寫入一些數據,讀取數據並回滾事務。多個TransactionScope問題

using(var transaction = new TransactionScope()) 
{ 
    using(var transaction = new TransactionScope()) 
    { 
      // save data via LINQ/DataContext 
      transaction.Complete(); 
    } 
    // Get back for assertions 
    var tempItem = // read data via LINQ/DataContext THROWS EXCEPTION 
} 

但是在讀我得到「System.Transactions.TransactionException:操作是無效的事務的狀態。」

我該如何設置交易屬性來避免這種情況?

+0

你使用哪個db? – TheVillageIdiot 2009-08-27 15:19:48

+0

微軟SQL 2005 – boj 2009-08-27 15:31:24

+0

可以幫助 http://stackoverflow.com/questions/2884863/under-what-c​​ircumstances-is-an-sqlconnection-automatically-enlisted-in-an-ambien – Joe 2012-06-05 17:43:38

回答

9

如果沒有完整的堆棧跟蹤,則無法調試此異常。根據具體情況,它有不同的含義。通常這意味着你正在做的事情你不應該在事務中,但沒有看到數據庫調用或堆棧跟蹤,所有人都可以做的就是猜測。一些常見的原因,我知道(這絕不是全面的,我知道)包括:

  1. 嵌套TransactionScope內訪問多個數據源(即不同的連接字符串)。這會導致升級到分佈式事務,如果您沒有運行DTC,它將會失敗。答案通常是而不是以啓用DTC,但是要清理您的交易或用新的TransactionScope(TransactionOptions.RequiresNew)包裝其他數據訪問。
  2. TransactionScope內未處理的異常。
  3. 任何違反隔離級別的操作,例如嘗試讀取剛剛插入/更新的行。
  4. SQL死鎖;在某些情況下,事務甚至可能自己死鎖,但如果#1適用,將其他操作隔離到新事務中會導致死鎖,如果不小心的話。
  5. 事務超時。
  6. 來自數據庫的任何其他錯誤。

我絕對不知道每一個可能的原因,但是如果你在代碼中發佈完整的堆棧跟蹤和實際的數據庫調用,我會看看並讓你知道我是否看到任何東西。

+0

安迪,謝謝你的回答。 #3上的問題re:「任何違反隔離級別的操作」。以下是否會違反隔離級別? DECLARE(atSmbol)someCount INT; 更新dbo。某些SET(atSmbol)someCount = [SomeCount] = [SomeCount] + 1 WHERE ID = 123 在我的用法(atSmbol)中,someCount是一個輸出參數。 如果是這樣,這不會違反隔離級別嗎? DECLARE(atSmbol)someCount INT; UPDATE dbo.Something SET [SomeCount] =(atSmbol)someCount = [SomeCount] + 1 WHERE ID = 123 注意,它認爲我試圖在使用at符號時標記某人的通知。 – Wes 2016-03-09 00:07:00

4

你有兩個嵌套的TransactionScope對象?

並沒有嘗試catch塊。

http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx

我想你會找到具體的答案是,你不能完成尚未開始任何交易,這是處於無效狀態。你真的有任何代碼,你的LINQ評論?連接實際上是否已建立?

+0

是的,嵌套。但爲什麼你鏈接MSDN? – boj 2009-08-27 15:36:12

+0

,因爲鏈接的文章解釋了爲什麼你得到這個異常,也許? – 2009-08-27 15:42:08

+0

@boj:因爲它有一個很好用的例子,用來解釋什麼時候發生,什麼時候發生。 – 2009-08-27 15:55:42