我设置DbContext
,我有这个代码:
base.Database.ExecuteSqlCommand("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;");
在上下文构造函数中。我执行这样的存储过程:
return base.Database.ExecuteSqlCommand("EXEC mystoredprocedure");
但是我遇到了死锁,因为它在读取提交的连接中执行。
我问,当存储过程是具有读取未提交连接的相同上下文的一部分时,存储过程是否以读取已提交方式运行是有任何理由的。
答案 0 :(得分:1)
请尝试使用TransactionScope,如下所示:
using (var txn = new TransactionScope(
TransactionScopeOption.RequiresNew,
new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted })
{
return base.Database.ExecuteSqlCommand("EXEC mystoredprocedure");
}
using (var txn = base.Database.BeginTransaction(IsolationLevel.ReadUncommitted))
{
return base.Database.ExecuteSqlCommand("EXEC mystoredprocedure");
}
默认情况下,EF将每个ExecuteSqlCommand
包装在自己的事务中。这就是为什么第一次调用SET ISOLATION LEVEL
不会将事务扩展到第二次调用EXEC proc
。有关在EF中使用以下链接处理交易的更多信息:
实体框架使用交易
https://msdn.microsoft.com/en-us/library/dn456843(v=vs.113).aspx