我使用的是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对表colors进行查询,我可以得到记录。
然后,如果我执行保存的更改并获得scope.Clompete(),如果我尝试使用Management Studio进行查询,则什么也得不到,因为注册表被阻塞,所以当我完成C#代码时,注册表将被释放,并在Management Studio中获得结果。
所以我的问题是,如何在C#中使用可序列化的隔离级别?我做错了什么吗?
附言:我注意到如果我使用这个命令:
DBCC useroptions;我看到隔离级别是serializable,但是如果我关闭Management Studio并再次连接,看到隔离级别是默认的readCommitted。
所以我的问题是如何为我的数据库设置默认隔离级别。
发布于 2013-01-26 21:19:41
Server默认ef事务隔离级别基于使用的数据库provider.
如何在DB Check 和上更改IsolationLevel
更新
对于更改isolation level,请在SSMS上运行下面提到的命令:
USE YourDatabaseName;
GO
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;检查是否已应用?
USE YourDatabaseName;
GO
DBCC useroptionsMSDN说:
一次只能设置一个隔离级别选项,在显式更改之前,该选项将一直为该连接设置。除非语句的FROM子句中的表提示为表指定了不同的锁定或版本控制行为,否则在事务内执行的所有读取操作都将根据指定隔离级别的规则进行操作。
我希望这能对你有所帮助。
https://stackoverflow.com/questions/14536805
复制相似问题