Проблем с множество 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
Коя db използвате?   -  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 относно: всяка операция, която нарушава нивото на изолация. Следното би ли нарушило нивото на изолация? DECLARE (atSmbol)someCount INT; АКТУАЛИЗАЦИЯ dbo.Something SET (atSmbol)someCount = [SomeCount] = [SomeCount]+ 1 WHERE ID = 123 При моята употреба (atSmbol)someCount е изходен параметър. Ако е така, няма ли това да нарушава нивото на изолация? DECLARE (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