【问题标题】:Transaction not being honored MySql .NET connector with multiple queries具有多个查询的 MySql .NET 连接器未兑现事务
【发布时间】:2013-04-26 17:34:08
【问题描述】:

我试过研究这个话题,但没有意义。我有一些代码尝试执行 UPDATE 查询,然后循环执行另一组 INSERT 查询。第二个查询错误,因为我省略了参数(目前这是故意引发错误)。 UPDATE 仍然被提交,即使它不应该......

这是代码......

using (MySqlConnection con = existingCon.Clone())
{
con.Open();

MySqlParameter paramTimeStamp;
MySqlParameter paramFileNo;
MySqlParameter paramDescription;
MySqlParameter paramComment;
MySqlParameter paramUserInfo;
MySqlParameter paramPaymentType;
MySqlParameter paramSeriesLink;
MySqlParameter paramOriginalSubmitDate;

using (MySqlTransaction transact = con.BeginTransaction())
{
    try
    {
        using (
            MySqlCommand cmd =
                new MySqlCommand(
                    "UPDATE Payments "
                        + "SET strStatus = 'processing-preupload' "
                        + "WHERE strStatus = 'processing-prepost';",
                    con))
        {
            cmd.Transaction = transact;
            cmd.ExecuteNonQuery();
        }
    }
    catch (Exception e)
    {
        transact.Rollback();
        throw;
    }

    foreach (Payment payment in payments)
    {
        try
        {
            using (
                MySqlCommand cmd =
                    new MySqlCommand(
                        "INSERT INTO Activity "
                            + "(dtmTimeStamp, strFileNumber, strDescription, strComment, "
                                + "strUserInfo, strPaymentType, dtmSeriesLink, dtmOriginalSubmitDate) "
                            + "VALUES (@paramTimeStamp, @paramFileNo, @paramDescription, @paramComment, "
                                + "@paramUserInfo, @paramPaymentType, @paramSeriesLink, @paramOriginalSubmitDate);",
                        con))
            {
                paramTimeStamp = new MySqlParameter("@paramTimeStamp", DateTime.Now);
                paramFileNo = new MySqlParameter("@paramFileNo", payment.strFileNumber);
                paramDescription = new MySqlParameter("@paramDescription", description);
                paramComment = new MySqlParameter("@paramComment", comment);
                paramUserInfo = new MySqlParameter("@paramUserInfo", userInfo);
                paramPaymentType = new MySqlParameter("@paramPaymentType", PAYMENT_TYPE);
                paramSeriesLink = new MySqlParameter(
                    "@paramSeriesLink",
                    payment.strSeriesLink_corrected);
                paramOriginalSubmitDate = new MySqlParameter(
                    "@paramOriginalSubmitDate",
                    payment.strSubmitDate_corrected);

                cmd.Transaction = transact;
                cmd.ExecuteNonQuery();
            }
        }
        catch (Exception e)
        {
            transact.Rollback();
            throw;
        }
    }

    transact.Commit();
}
}

想法?

【问题讨论】:

  • 它不应该影响结果,但你应该只需要一个try/catch 这里...
  • 你是对的。这段代码是我最近一次尝试,如果由于某种原因事务仍然被提交,则手动调用回滚。
  • 所以它确实执行了第二个“transact.Rollback();”?尽量不要多次将命令分配给事务。
  • @Blam 想要使用来自多个单独命令的事务是完全正常的;这应该不是问题
  • @MarcGravell 是的,但您仍然只需将命令分配给事务一次。

标签: c# mysql .net mysql-connector


【解决方案1】:

两个想法;首先:

在 MySQL 中,只有 InnoDB 和 BDB (BerkeleyDB) 表格式支持事务。其他标准存储引擎忽略事务,不能回滚数据修改。

那么...您使用的是什么表格格式?

其次:您可以尝试使用接受 IsolationLevel 的重载,只是为了明确 - 但我怀疑表格格式是这里真正的问题。

【讨论】:

  • MYISAM。答对了。不过有趣的是。它似乎在某一时刻起作用,但又停止了。数字我不寻找答案的一个地方...谢谢马克。
【解决方案2】:

也许这可以帮助某人。

一些旧版本的连接器(我认为是 6.4.4 左右)在查询错误后自动回滚事务。最新版本(6.9.6)似乎不是这种情况。

不过很有趣。它似乎在某个时候起作用,但又停止了”让我感到奇怪。

【讨论】:

    猜你喜欢
    • 2012-05-13
    • 2016-05-11
    • 2019-05-29
    • 2019-01-30
    • 2018-04-26
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多