如何更改隔离级别?

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#代码时,该记录会被释放,并在Management Studio中获得结果。
所以我的问题是,如何在C#中使用可序列化隔离级别?我做错了什么吗?
附言:我注意到如果我使用这个命令:
DBCC useroptions;

我发现隔离级别是serializable,但如果我关闭Management Studio并重新连接,隔离级别就会变为默认的readCommitted
我的问题是如何设置数据库的默认隔离级别。

我不明白。你已经正确地使用了可序列化的事务。你能换一种方式解释你想要什么吗? - usr
1个回答

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

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

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

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

如何更改数据库上的隔离级别,请参见Database Engine中的隔离级别SET TRANSACTION ISOLATION LEVEL(Transact-SQL)

更新

要更改隔离级别,请在SSMS上运行下面提到的命令:

USE YourDatabaseName;
GO
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

检查是否已应用?
USE YourDatabaseName;
GO
DBCC useroptions

MSDN表示:

在同一时间只能设置一个隔离级别选项,它将保持连接状态直到明确更改。除非语句的FROM子句中的表提示指定不同的锁定或版本控制行为,否则在事务中执行的所有读取操作都遵循指定隔离级别的规则。

希望这能对你有所帮助。


@usr 不是的。我指的是不要更改默认的隔离级别。如果有人想更改数据库(或SQL Server)的隔离级别,可以在DB端进行操作。没有必要通过给出“Serializable”或其他内容的隔离级别来在EF代码上执行此操作。这就是整个问题的关键所在。我认为我是正确的吧? - Sampath
1
我在管理工具中尝试了TSQL命令,但是当我退出并重新进入时,隔离级别变成了Read Committed。我该如何永久设置隔离级别? - Álvaro García

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接