运行 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 中的存储过程

Running stored procedure in a SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

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

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

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

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

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

我想问的是,当存储过程属于具有读取未提交连接的同一上下文的一部分时,它会 运行 以读取已提交的方式存在任何原因。

尝试使用 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。在下面的 link 中详细了解在 EF 中处理事务:

Entity Framework Working with Transactions

https://msdn.microsoft.com/en-us/library/dn456843(v=vs.113).aspx