Как использовать несколько вложенных транзакций? - PullRequest
4 голосов
/ 09 июня 2009

Я выполняю несколько операций в 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 и транзакциями в этом направлении?

Ответы [ 4 ]

2 голосов
/ 21 июня 2010

Для меня это был момент "лицо-ладонь", но, учитывая то, что я видел именно это поведение, и оно сразу меня не поразило, я решил, что я пойду вперед и опубликую это как возможность:

Я наблюдал такое поведение, когда у меня установлен TransactionScope для ReadUncommitted:

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

и мой Linq to SQL вызывал хранимую процедуру для возврата результатов процесса. Суть в том, что внутри самого процесса можно указать подсказку SQL WITH (NOLOCK), поэтому нет необходимости переносить запрос Linq to SQL в область транзакции ReadUncommitted. (По крайней мере, в моем случае)

1 голос
/ 21 июня 2010

Полагаю, вы пытаетесь прочитать некоторые данные и изменить их на лету (пока идет чтение).
В этом случае проще всего сначала прочитать все данные (например, с помощью метода расширения IEnumerable <>. ToList ()), а затем выполнить все операции с данными.

0 голосов
/ 21 августа 2012

Я знаю, что это старая ветка, но это ошибка верхнего уровня для Google по этой ошибке, поэтому я подумал, что стоит добавить мой ответ. В моем случае я использовал Entity Framework, так что даже не уверен, что он применим, но даже если некоторые люди, использующие EF, скорее всего, придут сюда. В моем случае это было потому, что я вызывал сохраненный процесс и ничего не делал с возвращенными строками. Поскольку EF не читал строки назад, это была «операция открытия». Мое решение состояло в том, чтобы просто добавить First () в конец каждого вызова процедуры:

myentities.CallMyStoredProc(A, B, C).First();
0 голосов
/ 09 июня 2009

Я знаю, что у нас возникла эта проблема в проекте, над которым я сейчас работаю, и я знаю, что это было связано с тем, что LinqToSql неправильно генерировал dbml-файл при работе с sproc. Мы должны были сделать это вручную, чтобы заставить это работать. LinqToSql, по-видимому, возвратил ISingeResult из sproc, и это породило ошибку.

Я не тот, кто исправил ошибку, но я знаю, что это как-то связано с этим.

Дополнительная информация: http://www.west -wind.com / weblog / posts / 246222.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...