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

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


person boj    schedule 27.08.2009    source источник
comment
Какую базу данных вы используете?   -  person TheVillageIdiot    schedule 27.08.2009
comment
может помочь stackoverflow.com/questions/2884863/   -  person Joe    schedule 05.06.2012


Ответы (2)


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

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

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

person AndyM    schedule 27.08.2009
comment
Энди, спасибо за этот ответ. Вопрос по №3 re: любая операция, нарушающая уровень изоляции. Будет ли следующее нарушать уровень изоляции? ОБЪЯВИТЬ (atSmbol) someCount INT; ОБНОВЛЕНИЕ dbo.Something SET (atSmbol) someCount = [SomeCount] = [SomeCount] + 1 WHERE ID = 123 В моем использовании (atSmbol) someCount является выходным параметром. Если да, не нарушает ли это уровень изоляции? ОБЪЯВИТЬ (atSmbol) someCount INT; ОБНОВЛЕНИЕ dbo.Something SET [SomeCount] = (atSmbol) someCount = [SomeCount] + 1 WHERE ID = 123 Обратите внимание, что я пытаюсь пометить кого-то для уведомления, когда использую символ at. - person Wes; 09.03.2016

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

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

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

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

person hollystyles    schedule 27.08.2009
comment
Да, вложенные. Но почему вы связали MSDN? - person boj; 27.08.2009
comment
потому что в связанной статье, возможно, объясняется, почему вы получаете это исключение? - person Josh E; 27.08.2009
comment
@boj: потому что у него есть пример использования с хорошими комментариями, объясняющими, что и когда происходит. - person hollystyles; 27.08.2009