运行 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");
}
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
我设置了一个 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");
}
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