Многократная проблема TransactionScope - PullRequest
6 голосов
/ 27 августа 2009

Я хочу создать транзакцию, записать некоторые данные в суб-транзакцию, прочитать данные обратно и откатить транзакцию.

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: операция недопустима для состояния транзакции.".

Как мне установить свойства транзакции, чтобы избежать этого?

Ответы [ 2 ]

9 голосов
/ 27 августа 2009

Это исключение нельзя отладить без полной трассировки стека. Это имеет различное значение в зависимости от контекста. Обычно это означает, что вы делаете что-то, что не следует делать внутри транзакции, но без просмотра вызовов db или трассировки стека все, что может сделать любой, - это угадать. Некоторые распространенные причины, о которых я знаю (и я уверен, это далеко не исчерпывающе):

  1. Доступ к нескольким источникам данных (т. Е. К разным строкам подключения) внутри вложенного TransactionScope. Это вызывает переход к распределенной транзакции, и если вы не используете DTC, произойдет сбой. Ответ обычно не , чтобы включить DTC, но чтобы очистить транзакцию или обернуть доступ к другим данным новым TransactionScope(TransactionOptions.RequiresNew).
  2. Необработанные исключения в пределах TransactionScope.
  3. Любая операция, которая нарушает уровень изоляции, например, попытка прочитать только что вставленные / обновленные строки.
  4. SQL-блокировки; транзакции могут даже блокировать себя в некоторых случаях, но если применяется # 1, изоляция других операций в новые транзакции может вызвать взаимные блокировки, если вы не будете осторожны.
  5. Тайм-ауты транзакций.
  6. Любая другая ошибка из базы данных.

Я точно не знаю всех возможных причин, но если вы опубликуете в своем коде полную трассировку стека и фактические вызовы БД, я посмотрю и сообщу, если что-нибудь увижу.

4 голосов
/ 27 августа 2009

У вас есть два вложенных объекта TransactionScope ??

И не пытайтесь поймать блок.

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

Я думаю, вы найдете конкретный ответ: вы не можете завершить транзакцию, которая ничего не начала, она в недопустимом состоянии У вас есть какой-нибудь код, где находятся ваши комментарии LINQ? соединение фактически установлено?

...