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

时间:2017-11-10 18:02:32

标签: c# sql-server stored-procedures entity-framework-6 read-uncommitted

我设置DbContext,我有这个代码:

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

请尝试使用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