gpt4 book ai didi

c# - EF 6 暂停执行策略和重叠执行 - "does not support user initiated transactions"异常

转载 作者:行者123 更新时间:2023-11-30 15:58:37 25 4
gpt4 key购买 nike

我在需要使用分布式事务以避免“‘SqlAzureExecutionStrategy’不支持用户启动的事务”异常的地方实现了 EF 6 执行策略的暂停,遵循以下示例:

https://romiller.com/2013/08/19/ef6-suspendable-execution-strategy/ https://msdn.microsoft.com/en-us/library/dn307226(v=vs.113).aspx

但是,最近我在批量数据管理 session 中遇到了两次失败,导致最终出现上述异常。

如果我理解正确,给出的示例在全局级别启用/禁用执行策略,这意味着如果在多个线程上同时执行操作,一个操作可以在另一个操作完成之前结束挂起。如果对跨越多个 SQL Azure 数据库的事务使用 .NET 4.6.1,效果可能最为明显,这可能需要一段时间才能完成。

为了避免这种情况,我求助于创建一个全局事务计数器,它以线程安全的方式递增和递减,并且只有在没有待处理的事务时才解除暂停,例如:

    public class MyConfiguration : DbConfiguration 
{
public MyConfiguration()
{
this.SetExecutionStrategy("System.Data.SqlClient", () => SuspendExecutionStrategy
? (IDbExecutionStrategy)new DefaultExecutionStrategy()
: new SqlAzureExecutionStrategy());
}

public static bool SuspendExecutionStrategy
{
get
{
return (bool?)CallContext.LogicalGetData("SuspendExecutionStrategy") ?? false;
}
set
{
CallContext.LogicalSetData("SuspendExecutionStrategy", value);
}
}
}

然后:

public class ExecutionHelper
{
private static int _pendingTransactions;

public void ExecuteUsingTransaction(Action action)
{
SuspendExeutionStrategy();
try
{
using (var transaction = new TransactionScope())
{
action();
transaction.Complete();
}
ResetSuspension();
}
catch (Exception ex)
{
ResetSuspension();
throw ex;
}
}

private void SuspendExeutionStrategy()
{
Interlocked.Increment(ref _pendingTransactions);
MyConfiguration.SuspendExecutionStrategy = true;
}


private void ResetSuspension()
{
Interlocked.Decrement(ref _pendingTransactions);
if (_pendingTransactions < 1 )
{
MyConfiguration.SuspendExecutionStrategy = false;
}
}
}

虽然 MSDN 上给出的示例没有考虑到这一点,但我仍然感到困惑。有什么我忽略的吗?

最佳答案

我得到了同样的错误:
“‘SqlAzureExecutionStrategy’不支持用户启动的事务”
我像这样重写了我的代码并且它有效:

var strategy = _context.Database.CreateExecutionStrategy();
await strategy.ExecuteAsync(async () =>
{
using (var dbContextTransaction = _context.Database.BeginTransaction())
{
// Your code here
dbContextTransaction.Commit();
}
catch (Exception ex)
{
dbContextTransaction.Rollback();
throw;
}
}
});

关于c# - EF 6 暂停执行策略和重叠执行 - "does not support user initiated transactions"异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42999516/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com