2009-08-27 15 views
6

Chcę utworzyć transakcję, zapisać niektóre dane w pod-transakcji, odczytać dane i wycofać transakcję.Problem z wieloma transakcjami Dotyczy:

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 
} 

Ale podczas czytania uzyskać „System.Transactions.TransactionException: Operacja nie jest ważne dla stanu transakcji.”.

W jaki sposób ustawić właściwości transakcji, aby tego uniknąć?

+0

Jakiego db używasz? – TheVillageIdiot

+0

Microsoft SQL 2005 – boj

+0

może pomóc http://stackoverflow.com/questions/2884863/under-what-circumstances-is-an-sqlconnection-automatically-enlisted-in-an-ambien – Joe

Odpowiedz

9

Ten wyjątek nie może być debugowany bez pełnego śledzenia stosu. Ma różne znaczenie w zależności od kontekstu. Zwykle oznacza to, że robisz coś, czego nie powinieneś robić w transakcji, ale bez podglądania wywołań db lub śledzenia stosu, wszystko, co można zrobić, to zgadnij. Niektóre typowe przyczyny wiem (i to bynajmniej nie jest wszechstronna jestem pewien) obejmują:

  1. Uzyskiwanie dostępu do wielu źródeł danych (czyli różne ciągi połączeń) w obrębie zagnieżdżonych TransactionScope. To powoduje awans do rozproszonej transakcji, a jeśli nie uruchamiasz DTC, to się nie powiedzie. Odpowiedź jest zwykle nie, aby włączyć DTC, ale aby wyczyścić transakcję lub zawinąć dostęp do innych danych za pomocą nowego TransactionScope(TransactionOptions.RequiresNew).
  2. Nieobsługiwane wyjątki w ramach TransactionScope.
  3. Każda operacja, która narusza poziom izolacji, na przykład podczas próby odczytu wierszy po prostu wstawionych/zaktualizowanych.
  4. Zakleszczenia SQL; transakcje mogą nawet w niektórych przypadkach zablokować się, ale jeśli # 1 ma zastosowanie, izolowanie innych operacji w nowych transakcjach może spowodować zakleszczenia, jeśli nie będziesz ostrożny.
  5. Limity czasu transakcji.
  6. Każdy inny błąd z bazy danych.

Zdecydowanie nie znam wszystkich możliwych przyczyn, ale jeśli prześlesz kompletny ślad stosu i faktyczne wywołania db w swoim kodzie, sprawdzę i dam znać, jeśli coś widzę.

+0

Andy, dzięki za tę odpowiedź. Pytanie na # 3 re: "każda operacja, która narusza poziom izolacji". Czy następujące naruszenia naruszają poziom izolacji? DECLARE (atSmbol) someCount INT; AKTUALIZACJA dbo.Coś SET (atSmbol) someCount = [SomeCount] = [SomeCount] + 1 WHERE ID = 123 W moim użyciu (atSmbol) someCount jest parametrem wyjściowym. Jeśli tak, czy nie naruszałoby to poziomu izolacji? DECLARE (atSmbol) someCount INT; UPDATE dbo.Something SET [SomeCount] = (atSmbol) someCount = [SomeCount] + 1 WHERE ID = 123 Uwaga, wydaje mi się, że próbuję oznaczyć kogoś w celu powiadomienia, gdy użyję symbolu at. – Wes

4

Masz dwa zagnieżdżone obiekty TransactionScope?

I nie próbuj catch catch.

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

myślę znajdziesz właściwa odpowiedź jest taka, że ​​nie można zakończyć transakcję, która niczego nie zaczął, to jest w nieprawidłowym stanie. Czy faktycznie masz jakiś kod, w którym znajdują się Twoje komentarze LINQ? czy rzeczywiście nawiązano połączenie?

+0

Tak, zagnieżdżone. Ale dlaczego połączyłeś MSDN? – boj

+0

, ponieważ artykuł w tym artykule wyjaśnia, dlaczego otrzymujesz ten wyjątek? –

+0

@boj: ponieważ ma przykład użycia z dobrymi komentarzami wyjaśniającymi, co się dzieje i kiedy. –

Powiązane problemy