如何避免“不支持嵌套事务”。错误?

时间:2014-01-29 21:22:39

标签: c# mysql .net entity-framework

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

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

  1. 尝试添加已存在的key ...导致错误:Duplicate entry 'asdf' for key 'UserName_UNIQUE'
  2. 之后尝试添加任何内容......导致错误:Nested transactions are not supported.
  3. 我想我不确定关于这两个查询的Nested是什么......我做错了什么:

    对于某些代码

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

    对于我添加的每个UserProfile,此代码段运行(正如我上面描述的流程所示)。

8 个答案:

答案 0 :(得分:6)

我有完全相同的问题。 通过将其包装到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

答案 1 :(得分:3)

我只是想重申“他们已经意识到这一点”但是如果没有人注册并碰到线程,那么当这是一个紧急问题时,可能需要更长时间才能解决。

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

以下是一个示例:server=localhost;port=3306;database=somedatabase;uid=someuser;password=itsasecret;ConnectionReset=True;

答案 4 :(得分:0)

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

您甚至可能必须处理当前的Connection,但我会先尝试处理这些交易。

答案 5 :(得分:0)

我在这里发布我的答案,因为这个帖子是googling时的第一个结果&#34;不支持实体框架嵌套交易&#34;希望它能帮助某人:

对我来说,在MySQL DB,longtext字段中尝试保存非法字符(希伯来字符)时出现此问题

答案 6 :(得分:0)

对于我来说,带有Entity Framework的客户端应用程序无法连接到Internet上托管在服务器上的MySql数据库。从互联网连接中删除proxy后,问题已解决。

答案 7 :(得分:0)

我在Oracle的MySQL.Data提供程序版本6.7.9中遇到了相同的错误。

该数据库的自动提交功能已关闭,在从DataSet保存更改之前必须使用事务(对DataAdapter.Update的调用)-使用相同模式但启用了自动提交的其他数据库没有必要

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

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

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