6

我正在使用 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# 代码时,寄存器被释放,我得到结果管理工作室。

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

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

DBCC useroptions;

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

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

4

1 回答 1

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

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

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

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

如何更改数据库引擎中 DB 检查隔离级别的 IsolationLevelSET TRANSACTION ISOLATION LEVEL (Transact-SQL)

更新

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

USE YourDatabaseName;
GO
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

检查它是否被应用?

USE YourDatabaseName;
GO
DBCC useroptions

MSDN 说:

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

我希望这对你有帮助。

于 2013-01-26T13:19:40.687 回答