【问题标题】:Using ExecuteSqlCommand and SavesChanges within same transaction with EntityFramework Core在 Entity Framework Core 的同一事务中使用 ExecuteSqlCommand 和保存更改
【发布时间】:2020-10-08 00:02:57
【问题描述】:

我正在追查 MySql / EF Core 的一个问题,我随机抛出一个异常说 Nested transactions are not supported。当我的系统仅由一个用户使用时,不会发生此异常。但是当我并行运行测试或有多个用户时,就会发生异常。我查看了所有代码,它们没有任何东西可以创建嵌套事务。

到目前为止,唯一让我害怕的代码如下:

using (var transaction = _context.Database.BeginTransaction())
{
    // Create a few entities and add them to the EF context
    ...

    // Insert the rows: hopefully at this point, my transaction is not commited yet.
    _context.SaveChanges();

    // I then want to update a few rows with a raw sql statement without 
    // having to load the entities in memory.   
    _context.Database.ExecuteSqlCommand("UPDATE ...");

    // Now that I have inserted and inserted some data, I want to commit all these 
    // changes atomically.
    transaction.Commit();
}

这样安全吗?我是否保证我的 SaveChanges 和 ExecuteSqlCommand 将在同一个 MySqlConnection 上执行?我有一种感觉,当我调用 SaveChanges 时,它会关闭我的连接并将其放回连接池。然后,我的 ExecuteSqlCommand 从池中获取一个新连接(它可能是同一个或另一个)。所以我的初始连接(我打开事务的那个)被放回池中,它可以被另一个线程重用。

这只是一种预感,我完全不确定这是否会导致问题。

最后我真正的问题是:

  • 在事务中使用 SaveChanges 和 ExecuteSqlCommand 是否安全?

【问题讨论】:

  • 与其猜测,不如使用 EF Core Logging,您会看到发生了什么。但是,是的,你是有保证的(或者应该 - 如果没有实现错误),否则BeginTransaction / UseTransaction 的整个目的毫无意义。

标签: entity-framework-core


【解决方案1】:

我从 MySql.Data.EntityFrameworkCore/MySql.Data 6.10.1-beta 升级到 6.10.3-rc,看起来问题已经消失了。由于问题是随机的,我不能完全确定问题是否确实已解决,但到目前为止还不错。

编辑: 3 年后,再也没有观察到这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 2020-03-12
    • 2018-05-24
    相关资源
    最近更新 更多