我正在使用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
。我的问题是如何设置数据库的默认隔离级别。