如何改变隔离级别?

时间:2013-01-26 12:10:48

标签: c# sql-server-2008 entity-framework transactions

我正在使用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

所以我的问题是如何设置数据库的默认隔离级别。

1 个答案:

答案 0 :(得分:1)

  • 默认EF事务隔离级别基于已使用的数据库提供程序。

  • 您的ef代码中未指定的隔离级别应导致数据库服务器的默认隔离级别。

  • 在SQL Server中,默认隔离级别为READ COMMITED。

  • 所以你不需要在你的EF代码上指定IsolationLevel。如果你在DB端设置它,它也需要EF的默认IsolationLevel。

如何更改数据库中的IsolationLevel检查Isolation Levels in the Database EngineSET TRANSACTION ISOLATION LEVEL (Transact-SQL)

<强>更新

要更改下面提到的isolation level运行SSMS上的命令:

USE YourDatabaseName;
GO
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

检查是否适用?

USE YourDatabaseName;
GO
DBCC useroptions

MSDN说:

  

一次只能设置一个隔离级别选项   仍然为该连接设置,直到明确更改为止。所有   读取操作在事务中执行的操作   除非表中的表提示,否则指定隔离级别的规则   语句的FROM子句指定不同的锁定或版本控制   表的行为。

我希望这会对你有所帮助。