gpt4 book ai didi

c# - 在 transactionScope 中删除用户时超时

转载 作者:行者123 更新时间:2023-11-30 23:24:14 24 4
gpt4 key购买 nike

  • 背景

我们正在尝试归档旧用户数据,以使我们最常用的表更小。

  • 问题

    用于删除记录的普通 EF 代码适用于我们的自定义表。 AspNetUsers 表是另一回事。执行此操作的方法似乎是使用 _userManager.Delete_userManager.DeleteAsync。这些工作无需尝试在一个事务中执行多个数据库调用。当我将其包装在 transactionScope 中时,它会超时。这是一个例子:

    public bool DeleteByMultipleIds(List<string> idsToRemove)
    {
    try
    {
    using (var scope = new TransactionScope())
    {
    foreach (var id in idsToRemove)
    {
    var user = _userManager.FindById(id);
    //copy user data to archive table
    _userManager.Delete(user);//causes timeout
    }
    scope.Complete();
    }
    return true;
    }
    catch (TransactionAbortedException e)
    {
    Logger.Publish(e);
    return false;
    }
    catch (Exception e)
    {
    Logger.Publish(e);
    return false;
    }
    }

请注意,当代码正在运行时,我会直接调用数据库,例如:

    DELETE
FROM ASPNETUSERS
WHERE Id = 'X'

它也会超时。此 SQL 在执行 C# 代码之前起作用。因此,看起来超过 1 db hit 似乎锁定了表。如何在一次事务中找到用户(数据库命中 #1)并删除用户(数据库命中 #2)?

最佳答案

对我来说,问题涉及在同一事务中使用多个单独的 DbContextBeginTransaction() 方法无效。

在内部,UserManager.Delete() 正在调用 RunSync() 包装器中的 async 方法。因此,为我的 TransactionScope 使用 TransactionScopeAsyncFlowOption.Enabled 参数确实有效:

using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
_myContext1.Delete(organisation);
_myContext2.Delete(orders);
_userManager.Delete(user);
scope.Complete();
}

关于c# - 在 transactionScope 中删除用户时超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37931394/

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