foreach循环中的提交事务

问题描述 投票:0回答:1

我正在foreach循环中向数据库添加一个条目并使用事务。但我收到此错误:

The connection is already in a transaction and cannot participate in another transaction.

UPDATE

        var user = await CurrentUser;

        if (user.IsNotNull())
        {
                using (var transaction = _context.Database.BeginTransaction())
                {
                    try
                    {
                        var reports = new List<ReportEntity>();

                        foreach (var model in modelList)
                        {
                            reports.Add(new ReportEntity
                            {
                                Id = Guid.NewGuid(),
                                UserId = user.Id,,
                                ReportTypeId =  ReportTypeId
                            });
                        }

                        await _context.tbl_Reports.AddRangeAsync(reports);
                        await _context.SaveChangesAsync();
                        await transaction.CommitAsync();
                        resp.Status = true;
                    }
                    catch (Exception e)
                    {
                        resp.ErrorMessage = e.Message;
                        await transaction.RollbackAsync();
                    }
                } //End of transaction
            }
         }
        else
        {
            resp.ErrorMessage = "User not found";
        }

我将根据POST中的对象数组在循环中添加记录。我什么时候提交事务,所以不会出现此错误?

c# asp.net-core asp.net-web-api transactions dbcontext
1个回答
1
投票

user为null的情况下,您似乎并没有关闭交易。这实际上是您的代码中发生的事情:

  1. 您调用调用_context.Database.BeginTransaction()的方法
  2. 已打开连接交易
  3. user为空,这导致不调用CommitAsyncRollbackAsync
  4. 即使方法执行完成后,事务仍在使用中,它在连接上处于打开状态
  5. 您再次调用该方法,也许会创建一个新的EF上下文,但是,EF上下文不会每次都创建一个新的连接,它将重新使用连接池中的现有连接]
  6. EF上下文选择在第2步中使用的已打开事务的连接
  7. 您尝试在已经打开事务的连接上打开另一个事务,并且会收到异常(即使这次user不为空)]

我想它应该以这种方式工作。您可以尝试提交/回滚事务,即使数据库中的任何内容都没有更改,也应该可以解决此问题。

SqlConnection.BeginTransaction上的文档说:

您必须使用Commit或Rollback方法显式提交或回滚事务。

© www.soinside.com 2019 - 2024. All rights reserved.