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.
Nie rozumiem. Używasz już poprawnie transakcji serializowalnej. Czy możesz wyjaśnić, czego chcesz inaczej? – usr