我正在使用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#中使用可序列化的隔离级别?我做错了什么?
P.S。:我注意到如果我使用这个命令:
DBCC useroptions;
我看到隔离级别为serializable
,但是如果我关闭Management Studio并再次连接,并且看到隔离级别是默认的readCommitted
。
所以我的问题是如何设置数据库的默认隔离级别。
答案 0 :(得分:1)
默认EF事务隔离级别基于已使用的数据库提供程序。
您的ef代码中未指定的隔离级别应导致数据库服务器的默认隔离级别。
在SQL Server中,默认隔离级别为READ COMMITED。
所以你不需要在你的EF代码上指定IsolationLevel。如果你在DB端设置它,它也需要EF的默认IsolationLevel。
如何更改数据库中的IsolationLevel检查Isolation Levels in the Database Engine和SET TRANSACTION ISOLATION LEVEL (Transact-SQL)
<强>更新强>
要更改下面提到的isolation level
运行SSMS上的命令:
USE YourDatabaseName;
GO
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
检查是否适用?
USE YourDatabaseName;
GO
DBCC useroptions
MSDN说:
一次只能设置一个隔离级别选项 仍然为该连接设置,直到明确更改为止。所有 读取操作在事务中执行的操作 除非表中的表提示,否则指定隔离级别的规则 语句的FROM子句指定不同的锁定或版本控制 表的行为。
我希望这会对你有所帮助。