Skip to content

提交事务后,工作单元和数据上下文无法重用 #283

@gmf520

Description

@gmf520

描述一下BUG

当一次请求当中,执行IUnitOfWork.Commit()提交事务后,(MySql中)无法进行数据查询,无法在进行数据CUD之后再次提交事务,这与原生EFCore的表现不符

重现步骤

例如,执行如下Action,在执行await manager.CreateAsync(new Role() { Name = "测试角色4" + token, Remark = "测试角色002描述" });时,MySql中会报异常The transaction associated with this command is not the connection’s active transaction

  [HttpPost]
  [Description("测试2")]
  public async Task<int> Test02()
  {
      IServiceProvider provider = HttpContext.RequestServices;
      string token = Guid.NewGuid().ToString("N").Substring(0, 5);
      RoleManager<Role> manager = provider.GetRequiredService<RoleManager<Role>>();
      await manager.CreateAsync(new Role() { Name = "测试角色3" + token, Remark = "测试角色描述" });
      await manager.CreateAsync(new Role() { Name = "测试角色4" + token, Remark = "测试角色描述" });

      return provider.GetRequiredService<RoleManager<Role>>().Roles.Count();
  }

原因分析

提交事务后,数据上下文仍带着已经释放的事务对象,导致后续的操作无法正常执行

解决方案

  • 在UnitOfWork中,执行BeginOrUseTransaction时检查事务对象DbTransaction的状态,如果transaction.Connection == null则重新创建事务
  • 提交事务后,对关联的数据上下文DbContext释放事务:context.Database.UseTransaction(null)

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions