0

我设置了一个DbContext我有这个代码的地方:

base.Database.ExecuteSqlCommand("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;");

在上下文构造函数中。我执行这样的存储过程:

return base.Database.ExecuteSqlCommand("EXEC mystoredprocedure");

但我遇到了死锁,因为这是在读取提交的连接中执行的。

我问的是,当存储过程属于具有读取未提交连接的同一上下文的一部分时,是否有任何理由以读取提交的方式运行。

4

1 回答 1

2

尝试使用TransactionScope,如下所示:

using (var txn = new TransactionScope(
                TransactionScopeOption.RequiresNew, 
                new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted })
{
    return base.Database.ExecuteSqlCommand("EXEC mystoredprocedure");
}

或使用Database.BeginTransaction

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

于 2017-11-11T00:38:52.723 回答