【问题标题】:How to avoid a "Nested transactions are not supported." error?如何避免出现“不支持嵌套事务”。错误?
【发布时间】:2014-01-29 21:22:39
【问题描述】:

我正在使用 EF6 与 MySql 数据库进行一些非常简单的集成。

Nested transactions are not supported. 错误发生在我执行以下操作后:

  1. 尝试添加一个已经存在的key...这会导致错误:Duplicate entry 'asdf' for key 'UserName_UNIQUE'
  2. 之后尝试添加任何内容...这会导致错误:Nested transactions are not supported.

我想我不确定Nested 这两个查询会是什么......我做错了什么:

还有一些代码

using (var db = C2SCore.BuildDatabaseContext())
{
  db.Users.Add(new UserProfile { UserName = UserName, Password = Password });
  db.SaveChanges(); // <- Errors occur here...
}

这个 sn-p 会为我添加的每个 UserProfile 运行(正如我上面描述的流程所暗示的那样)。

【问题讨论】:

  • 重复的key 代码在哪里?
  • @rae1 UserName 是 key...如果这就是你要问的。
  • 如果显式打开一个包装的 TransactionScope 会发生什么?而且没有从其他地方打开的上下文,是吗?
  • 重复key错误出现在哪里,“嵌套事务...”错误出现在哪里?
  • @rae1 它们都出现在db.SaveChanges()

标签: c# mysql .net entity-framework


【解决方案1】:

我也有同样的问题。 通过将其包装到 TransactionScope 中尝试以下解决方法:

using System.Transactions; // Add assembly in references

using (var db = C2SCore.BuildDatabaseContext())
{
  using (var tran = new TransactionScope())
  {
    db.Users.Add(new UserProfile { UserName = UserName, Password = Password });
    db.SaveChanges(); // <- Should work now after first exception
    tran.Complete();
  }
}

<package id="MySql.Data" version="6.8.3" targetFramework="net45" />
<package id="MySql.Data.Entities" version="6.8.3.0" targetFramework="net45" />

但是,他们知道这一点:http://bugs.mysql.com/bug.php?id=71502

【讨论】:

  • 这是我找到的唯一解决方法,谢谢。它确实需要对您的代码进行大量更改,但是因为每个带有DbContext.SaveChanges() 的操作都必须包含在TransactionScope 中。如果您的应用程序只有其中一些,可能会很有用。
  • 更正:这对我不起作用。没有发生异常,但数据没有保存到数据库中。
【解决方案2】:

我只想重申“他们知道这一点”,但如果没有人注册并提出问题,当这是一个紧急问题时,可能需要更长的时间才能解决。 p>

http://bugs.mysql.com/bug.php?id=71502

【讨论】:

    【解决方案3】:

    尝试在开头添加db.Connection.Open(),在结尾添加db.Connection.Close()。

    【讨论】:

      【解决方案4】:

      看看现在是 2017 年,这个问题仍然存在,我将发布我能找到的唯一解决方法,它不涉及拉取源代码。将 ConnectionReset=True 添加到连接字符串将解决该问题。应该注意的是,对于连接池中使用的每个连接,这将导致额外的数据库往返。

      这里是一个例子:server=localhost;port=3306;database=somedatabase;uid=someuser;password=itsasecret;ConnectionReset=True;

      【讨论】:

        【解决方案5】:

        然后,该错误表明您需要在出现第一个错误后处理该事务,然后才能继续进行其他操作。我建议放置一个try ... catch 并在finally 块中处理当前事务。

        你甚至可能不得不处理掉当前的Connection,但我会先尝试处理这些事务。

        【讨论】:

        • 上下文对象周围有一个using,提供的代码不表示任何上下文泄漏。
        【解决方案6】:

        我在这里发布我的答案,因为这个线程是谷歌搜索“不支持实体框架嵌套事务”时的第一个结果,希望它可以帮助某人:

        对我来说,这个问题是在尝试在 MySQL DB 长文本字段中保存非法字符(希伯来字符)时出现的

        【讨论】:

          【解决方案7】:

          在我的例子中,带有实体框架的客户端应用程序无法通过 Internet 连接到托管在服务器上的 MySql 数据库。从互联网连接中删除proxy 后问题解决。

          【讨论】:

            【解决方案8】:

            我在使用 Oracle 的 MySQL.Data 提供程序 6.7.9 版时遇到了同样的错误。

            数据库关闭了自动提交功能,在保存来自 DataSet 的更改(调用 DataAdapter.Update)之前必须使用事务 - 另一个使用相同架构但打开自动提交的数据库没有必要.

            使用仅用于保存的事务适用于 DevArt 的 dotConnect.Express.for.MySQL 驱动程序(版本 8.16.1541),但不适用于 Oracle 的驱动程序。

            看起来使用 Oracle 的驱动程序,即使是选择访问数据库也会创建某种默认事务。

            因此,在对数据库的每次读取访问(DataAdapter.Fill)使用事务之后,我终于可以使用 Oracle 的驱动程序了。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-06-08
              • 2013-01-04
              • 1970-01-01
              • 2018-10-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多