首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用多个查询的MySql .NET连接器未执行事务

问使用多个查询的MySql .NET连接器未执行事务
EN

Stack Overflow用户
提问于 2013-05-02 21:52:27
回答 2查看 1.4K关注 0票数 1

我试着研究过这个话题,但没有任何意义。我有一些代码试图执行一个UPDATE查询,然后遍历另一组插入查询。第二个查询出错,因为我省略了参数(这是故意造成错误的)。更新仍然被提交,即使它不应该被提交...

这是代码……

代码语言:javascript
复制
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();
}
}

有什么想法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-02 22:06:02

有两个想法:第一,

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

所以..。您使用的是什么表格格式?

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

票数 2
EN

Stack Overflow用户

发布于 2015-03-28 18:39:45

也许这能帮到什么人。

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

“有趣的是,它似乎能工作,但又停了下来”,这让我很好奇。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16339851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档