2013-01-26 9 views
5

Używam EF 4.0, i chciałbym użyć poziomu izolacji serializable, ponieważ w transakcji chciałbym zablokować rejestr, gdy zostanie odczytany.jak zmienić poziom izolacji?

Cóż, w SQL Server Próbuję zmienić poziom izolacji z tym poleceniem:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; 

A w C# używam tego kodu, aby spróbować zablokować rejestrze

using (var scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.Serializable })) 
{ 
    Entities myContext = new Entities(); 
    string colors = "select * from Colors where IDColor = 2"; 
    Colors myColor = myContext.Colors.SqlQuery(colors).FirstOrDefault<Colors>(); 
    myColor.Color = "Red"; 
    myContext.SaveChanges(); 
    scope.Complete();     
} 

Gdybym wykonaj linię po linii mój kod, jeśli otrzymam SaveChanges, ale nadal nie jest wykonać, jeśli wykonam zapytanie do kolorów tabeli z SQL Server Management Studio na przykład, mogę uzyskać rekord.

Następnie, jeśli wykonam zapisanie zmian i otrzymam scope.Clompete(), jeśli wypróbuję zapytanie z Management Studio, nic nie otrzymam, ponieważ rejestr jest zablokowany, więc kiedy skończę mój kod C#, rejestr zostanie zwolniony i Otrzymuję wynik w Management Studio.

Moje pytanie brzmi: jak korzystać z poziomu izolacji szeregowej w C#? czy robię coś źle?

P.S .: Zauważyłem, że jeśli mogę użyć tego polecenia:

DBCC useroptions; 

widzę, że poziom izolacji jest serializable, ale jeśli zamknę Management Studio i połączyć ponownie i zobaczyć poziom izolacji jest domyślnym readCommitted.

Moje pytanie brzmi: jak ustawić domyślny poziom izolacji dla mojej bazy danych.

+0

Nie rozumiem. Używasz już poprawnie transakcji serializowalnej. Czy możesz wyjaśnić, czego chcesz inaczej? – usr

Odpowiedz

1
  • Domyślny poziom izolacji transakcji EF jest oparty na dostawcy używanej bazy danych.

  • Nieokreślony poziom izolacji w kodzie ef powinien spowodować domyślny poziom izolacji serwera bazy danych.

  • W SQL Server domyślnym poziomem izolacji jest READ COMMITED.

  • Nie trzeba więc określać parametru IsolationLevel na kodzie EF.Jeśli ustawisz go po stronie DB, będzie to również domyślna wartość IsolationLevel dla EF.

Jak zmienić IsolationLevel na DB Odjazd Isolation Levels in the Database Engine i SET TRANSACTION ISOLATION LEVEL (Transact-SQL)

UPDATE

za zmiany bieg isolation level poniżej wymienione polecenie w SSMS:

USE YourDatabaseName; 
GO 
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; 

Dla sprawdzenia, czy jest to zastosowano?

USE YourDatabaseName; 
GO 
DBCC useroptions 

MSDN mówi:

Tylko jedna z opcji poziom izolacji można ustawić na raz, i to jest ustawiony dla tego połączenia, dopóki nie zostanie wyraźnie zmieniony. Wszystkie operacje odczytu wykonywane w ramach transakcji działają zgodnie z regułami dla określonego poziomu izolacji, chyba że wskazówka tabeli w klauzuli FROM instrukcji określa inne zachowanie blokowania lub wersji blokowania lub wersjonowania dla tabeli.

Mam nadzieję, że to ci pomoże.

+0

@usr Nie. Chciałem tutaj zmienić domyślny poziom izolacji. Jeśli ktoś chce zmienić poziom izolacji DB (lub serwera sql), może to zrobić po stronie db. Nie trzeba tego robić na kodzie ef, dając poziom izolacji jako "Serializable". "lub coś innego. Cała sprawa. Czuję, że mam rację? – Sampath

+0

Cóż, wypróbowałem polecenie TSQL w studiu zarządzania, ale kiedy wychodzę i wchodzę ponownie, poziom izolacji to Read Committed. Jak mogę ustawić poziom izolacji na zawsze? –

+0

@Daimroc Zaktualizowałem mój post. Plz to sprawdź. – Sampath

Powiązane problemy