2009-06-09 80 views
4

我在linq2sql中做了一些需要在事務中運行的操作。但是,我在事務內部使用的一些方法也使用linq2sql,並在它們自己的事務中運行(內部事務在存儲過程中運行)。這使我異常如何使用多個嵌套的事務處理器?

[TransactionInDoubtException: The transaction is in doubt.] 
    System.Transactions.TransactionStateInDoubt.EndCommit(InternalTransaction tx) +76 
with the inner exception 
[SqlException (0x80131904): There is already an open DataReader associated with this Command which must be closed first.] 

如果我使用MultipleActiveResultSets爲SQL Server,我反而得到的異常

[SqlException (0x80131904): The transaction operation cannot be performed because there are pending requests working on this transaction.] 

沒有人有從LINQ2SQL和transactionscopes這樣的工作經驗?

回答

0

我知道,我們已經經歷了該項目I'm這個問題目前正在研究,我知道有一些東西需要與一個存儲過程工作時LinqToSql產生的dbml文件的錯誤的方式。我們必須手動完成工作。 LinqToSql顯然從sproc返回了ISingeResult,並生成了錯誤。

我wasn't誰糾正錯誤的人,但我知道它有什麼與此有關。

更多信息:http://www.west-wind.com/weblog/posts/246222.aspx

2

這對我來說是「面子掌」的時刻,但考慮到我是看到這個確切的行爲,並沒有馬上打我,我想我會繼續前進,發佈這種可能性:

我看到這種行爲,當我有READUNCOMMITTED一個TransactionScope集:

using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, 
     new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted }) 

和我的LINQ到SQL中調用存儲過程返回PROC的結果。面向掌中的是,在proc本身中,可以指定WITH(NOLOCK)SQL提示,因此不需要將Linq to SQL查詢包裝在ReadUncommitted事務範圍中。 (至少在我的情況)

1

我猜,你想讀一些數據,並修改它的飛行(而讀仍在進行中)。
在這種情況下,最簡單的辦法是首先讀所有的數據(例如,使用的IEnumerable <> .ToList()擴展方法),然後執行所有對數據的操作。

+0

這結束了我的問題上面類似的問題,所以從我的+1 :) – James 2011-01-19 19:41:48

0

我知道這是一個古老的線程,但它是頂級命中谷歌在這個錯誤,所以我認爲這將是值得加入我的答案。在我的情況下,我使用實體框架,所以甚至不確定它適用,但即使如此,一些使用EF的人可能會來到這裏。在我的情況下,這是因爲我正在調用一個存儲過程,並且沒有對返回的行進行任何操作。因爲EF沒有讀取行,所以這是「打開操作」。我的解決辦法是簡單地一()添加到每個過程調用的末尾:

myentities.CallMyStoredProc(A, B, C).First();