【问题标题】:How to use TransactionScope in .NET Core如何在 .NET Core 中使用 TransactionScope
【发布时间】:2021-10-05 00:50:43
【问题描述】:

在我的 API 控制器中,我有这样的代码:

[HttpPost]
public async Task<ActionResult<TransactionDto>> CreateNewTrasaction(TransactionDto accountCreateDto)
{
    var commandModel = _mapper.Map<TransactionHistory>(accountCreateDto);
    _transactionRepository.CreateTransaction(commandModel);

    var accountReadDto = _mapper.Map<AccountReadDto>(commandModel);

    return Ok();
}

transactionRepository 类中,我执行了以下操作:

private readonly TransactionContext _transContext;

public TransactionRp(TransactionContext tContext)
{
    _transContext = tContext;
}

public async Task CreateTransaction(TransactionHistory transaction)
{
    using(IDbContextTransaction transactionContext = _transContext.Database.BeginTransaction())
    {
        try
        {
            transaction.CreatedDate = DateTime.UtcNow;
            _transContext.TransactionHistories.Add(transaction);
            await _transContext.SaveChangesAsync();

            var senderAccount = _transContext.Accounts.FirstOrDefault(x => x.AccountNo == transaction.AccountNo);
            var receiverAccount = _transContext.Accounts.FirstOrDefault(x => x.AccountNo == transaction.ReceiverAccount);

            senderAccount.Amount = senderAccount.Amount - transaction.Amount;
            receiverAccount.Amount = senderAccount.Amount + transaction.Amount;

            _transContext.Accounts.Update(receiverAccount);
            _transContext.Accounts.Update(receiverAccount);
        }
        catch (Exception ex)
        {
            throw;
        }
    }
}

但是当我运行代码时,我在这一行得到一个错误

await _transContext.SaveChangesAsync();

错误是:

无法访问已释放的上下文实例。
此错误的常见原因是释放从依赖注入中解析的上下文实例,然后尝试在应用程序的其他地方使用相同的上下文实例。
如果您在上下文实例上调用“Dispose”或将其包装在 using 语句中,则可能会发生这种情况。如果你使用依赖注入,你应该让依赖注入容器负责处理上下文实例。

对象名称:'TransactionContext'

更新

这就是我在 ConfigureServices 中管理上下文的方式

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<TransactionContext>(opt => opt.UseSqlServer
        (Configuration.GetConnectionString("BankConnection"))
    );
} 

【问题讨论】:

  • 你没有展示 _transContext 是如何管理的。是 DI 吗?
  • @DavidBrowne-Microsoft 更新了代码,我是 .net 核心的新手。我想这就是你问的
  • 为什么要首先使用 TransactionScope?如果您使用 EF Core 或类似的 ORM,则更改会被缓存,并且仅在请求结束时调用 SaveChanges 时才会持久保存到数据库中。您不需要显式事务,DbContext 本身为您提供事务语义。如果您多次致电SaveChanges...不要。至少不是没有非常严重的原因
  • 如果您想要分布式事务,.Net 核心不支持它们。顺便说一句,您不是在等待任务,这意味着无法保证实际处理操作的时间。 (可能是在初始通话结束后,这就是您收到已处理错误的原因。)

标签: c# asp.net-core asynchronous


【解决方案1】:

似乎问题出在控制器上。使用 awaitasync 方法。 async 关键字用于使函数异步。 await 关键字将要求执行等到定义的任务被执行。 Read more

[HttpPost]
public async Task<ActionResult<TransactionCreateDto>> CreateNewTrasaction(TransactionCreateDto accountCreateDto)
{
    var commandModel = _mapper.Map<TransactionHistory>(accountCreateDto);
    await _trasactionRepository.CreateTransaction(commandModel);
    var accountReadDto = _mapper.Map<AccountReadDto>(commandModel);
    return Ok();
}

【讨论】:

    猜你喜欢
    • 2021-06-15
    • 2021-08-28
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多