2013-02-19 14 views
6

Podczas zapisywania danych w bazie danych użyłem TransactionScope z IsolationLevel ustawionym na Serializable.Zmień parametr TransactionScope IsolationLevel po zakończeniu transakcji

TransactionOptions options = new TransactionOptions 
     { 
      IsolationLevel=IsolationLevel.Serializable 
     }; 


using (var transaction = new TransactionScope(TransactionScopeOption.Required,options)) 
{ 
    transation.Complete(); 
} 

Teraz po zakończeniu wykonywania, chcę zmienić TransactionScopeIsolationLevel.

Edit

Co rozumiem, jest to, czy IsolationLevel ustawiony Serializable następnie po zakończeniu transakcji, celem połączenia jest zamknięta i powrócić do puli połączeń, a gdy jakaś inna prośba dotrze on sprowadzić ten obiekt połączenia z puli, a tym samym dokonanej przez poprzednią opcję IsolationLevel. Dlatego po każdej transakcji chcę zmienić poziom izolacji na domyślny.

Odpowiedz

5

Masz rację: poziom izolacji nie jest resetowany podczas zwracania połączenia z pulą. To jest okropne zachowanie, ale jesteśmy zatrzymany z nim ...

Istnieją dwie strategie:

  1. zresetować poziom izolacji przed powrotem: To jest twoje podejście.
  2. Zawsze używaj połączenia z jawną transakcją (lub TransactionScope), aby zagwarantować poziom izolacji.

Polecam ci to drugie.

Jeśli nalegasz na wykonanie (1), możesz po prostu zmienić poziom izolacji po zamknięciu TransactionScope, ale musisz to zrobić z obiektem połączenia. Przykład:

using (SqlConnection connection = new SqlConnection(connectionString)) 
{ 
    using (var transaction = new TransactionScope(TransactionScopeOption.Required,options)) 
    { 
     connection.Open(); //open inside of scope so that the conn enlists itself 
     transation.Complete(); 
    } 
    //conn is still open but without transaction 
    conn.ExecuteCommand("SET TRANSACTION ISOLATION LEVEL XXX"); //pseudo-code 
} //return to pool 

Czy to działa dla Ciebie?

+0

Dzięki za odpowiedź, jestem gotów zaakceptować inne lepsze opcje, ale jak sugerujesz, aby otworzyć wszystkie połączenia z jawnymi transakcjami, nie sądzisz, że spowoduje to wiele kosztów ogólnych. Mam ogromną aplikację setki punktów końcowych, ale istnieje tylko kilka scenariuszy, w których używam TransactionScope. Co sugerujesz do takich rzeczy? – MegaMind

+0

Narzut transakcji jest prawie zerowy, ponieważ wszystkie instrukcje i tak korzystają z niejawnej transakcji .; Jeśli nie możesz migrować wszystkiego, Twoje podejście może być dobrym pomysłem. Hak, ale pragmatyczne rozwiązanie. Nie widzę żadnych większych problemów z tym. – usr

+0

ma conn.ExecuteCommand ("USTAWIĆ POZIOM IZOLACJI TRANSAKCJI XXX"); praca? Czy ktoś próbował? – hazimdikenli

2

Byłem trochę przez to. Na szczęście logika Ciągów Połączeń została scentralizowana. To, co zrobiłem, to zmienić ustawienie aplikacji połączenia, jeśli Transaction.Current nie ma wartości NULL (co oznaczałoby, że znajdujemy się w TransactionScope).

W ten sposób połączenia TransactionScope nie łączą się z innymi.

Powiązane problemy