如何改变隔离级别?

Álv*_*cía 5 c# entity-framework transactions sql-server-2008

我正在使用EF 4.0,我想使用隔离级别serializable,因为在事务中我想在读取时阻塞寄存器.

好吧,在SQL Server中我尝试使用此命令更改隔离级别:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
Run Code Online (Sandbox Code Playgroud)

在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();                  
}
Run Code Online (Sandbox Code Playgroud)

如果我逐行执行我的代码,如果我得到SaveChanges但仍然没有执行,如果我使用SQL Server Management Studio查询表颜色,我可以获取记录.

然后,如果我执行保存更改并且我得到了scope.Clompete(),如果我使用Management Studio尝试查询,我什么也得不到,因为寄存器被阻止,所以当我完成我的C#代码时,寄存器被释放,我得到了结果管理工作室.

所以我的问题是,如何在C#中使用可序列化的隔离级别?难道我做错了什么?

PS:我注意到如果我使用这个命令:

DBCC useroptions;
Run Code Online (Sandbox Code Playgroud)

我看到隔离级别是serializable,但是如果我关闭Management Studio并再次连接并且看到隔离级别是默认值readCommitted.

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

Sam*_*ath 2

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

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

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

  • 因此,您不需要在 EF 代码上指定 IsolationLevel。如果您在 DB 端设置它,它也会作为 EF 的默认 IsolationLevel。

如何更改数据库引擎中数据库检查隔离级别的隔离级别设置事务隔离级别 (Transact-SQL)

更新

要更改,请isolation level在 SSMS 上运行以下命令:

USE YourDatabaseName;
GO
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
Run Code Online (Sandbox Code Playgroud)

检查是否适用?

USE YourDatabaseName;
GO
DBCC useroptions
Run Code Online (Sandbox Code Playgroud)

MSDN 说:

一次只能设置一个隔离级别选项,并且它会保持为该连接设置,直到显式更改为止。事务中执行的所有读操作都在指定隔离级别的规则下运行,除非语句的 FROM 子句中的表提示指定了表的不同锁定或版本控制行为。

我希望这对你有帮助。