2013-01-26 8 views
5

Я использую EF 4.0, и я бы хотел использовать уровень изоляции serializable, потому что в транзакции я хотел бы заблокировать регистр при чтении.Как изменить уровень изоляции?

Ну, в SQL Server Я пытаюсь изменить уровень изоляции с помощью этой команды:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; 

И в C# Я использую этот код, чтобы попытаться блокировать регистр:

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();     
} 

Если я выполнить строку за строкой мой код, если я получу SaveChanges, но все равно не выполняется, если я делаю запрос к цветам таблицы с помощью SQL Server Management Studio, например, я могу получить запись.

Затем, если я выполняю изменения сохранения, и получаю scope.Clompete(), если я пытаюсь выполнить запрос с помощью Management Studio, я ничего не получаю, потому что регистр заблокирован, поэтому, когда я заканчиваю свой код C#, регистр освобождается и Я получаю результат в Management Studio.

Итак, мой вопрос заключается в том, как использовать сериализуемый уровень изоляции в C#? Я делаю что-то неправильно?

P.S .: Я заметил, что если я использую эту команду:

DBCC useroptions; 

Я вижу, что уровень изоляции serializable, но если я закрываю Management Studio и подключитесь еще раз и посмотреть уровень изоляции по умолчанию readCommitted.

Итак, мой вопрос заключается в том, как установить уровень изоляции по умолчанию для моей базы данных.

+0

Я не понимаю. Вы уже используете сериализуемую транзакцию правильно. Можете ли вы объяснить, что вы хотите по-другому? – usr

ответ

1
  • Уровень изоляции транзакций по умолчанию для EF основан на использовании используемого поставщика баз данных.

  • Неопределенный уровень изоляции в вашем ef-коде должен приводить к уровню изоляции по умолчанию для сервера базы данных.

  • В SQL Server уровень изоляции по умолчанию READ COMMITED.

  • Таким образом, вам не нужно указывать IsolationLevel на свой EF-код. Если вы установите его на стороне БД, он также использует значение IsolationLevel для EF по умолчанию.

Как изменить IsolationLevel на DB Проверьте Isolation Levels in the Database Engine и SET TRANSACTION ISOLATION LEVEL (Transact-SQL)

UPDATE

Для изменения isolation level запустить нижеуказанным команду на SSMS:

USE YourDatabaseName; 
GO 
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; 

Для проверки того, является ли он применяется?

USE YourDatabaseName; 
GO 
DBCC useroptions 

MSDN говорит:

только один из вариантов уровня изоляции может быть установлен в то время, и он остается установленным для этой связи, пока не будет явно изменен. Все операции считывания выполняются в соответствии с правилами для указанного уровня изоляции, за исключением случаев, когда подсказка таблицы в предложении FROM оператора указывает на различную операцию блокировки или управления версиями для таблицы.

Я надеюсь, что это поможет вам.

+0

@usr Нет. Здесь я имел в виду не изменять уровень изоляции по умолчанию. Если кто-то хочет изменить уровень изоляции БД (или SQL-сервера), тогда они могут сделать это на стороне db. Не нужно делать это на ef-коде, предоставляя уровень изоляции как «Serializable «или что-то еще. Это весь смысл. Я чувствую, что я прав? – Sampath

+0

Ну, я пробовал команду TSQL в студии управления, но когда я выхожу и снова вхожу, уровень изоляции - Read Committed. Как я могу установить уровень изоляции навсегда? –

+0

@ Daimroc Я обновил свое сообщение. Plz проверить это. – Sampath

Смежные вопросы