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

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

最佳答案

  • 默认EF事务隔离级别基于使用的数据库提供程序。
  • ef代码中未指定的隔离级别应导致数据库服务器的默认隔离级别。
  • 在SQL Server中,默认隔离级别为READ COMMITED。
  • 所以您不需要在EF代码上指定IsolationLevel,如果在数据库端进行设置,它也将作为EF的默认IsolationLevel。

  • 如何在DB Check Isolation Levels in the Database EngineSET TRANSACTION ISOLATION LEVEL (Transact-SQL)上更改IsolationLevel

    更新

    要更改isolation level,请在SSMS上运行以下提到的命令:
    USE YourDatabaseName;
    GO
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    

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

    MSDN说:



    希望对您有帮助。

    关于c# - 如何更改隔离级别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14536805/

    10-13 06:55