【问题标题】:Why won't my transaction make changes to the database?为什么我的事务不会更改数据库?
【发布时间】:2014-11-10 14:27:39
【问题描述】:

我正在编写一个需要更新 MySQL 数据库的应用程序。我现在正在做的是从表中删除行,然后插入新数据,所以我使用事务来确保我得到所有或没有更改。但是,什么都没有改变,我不知道为什么,因为没有抛出异常。

这是交易的代码sn-p:

using(var conn = new MySqlConnection(connectionString))
{
    conn.Open();
    // Use transaction to get all or nothing
    using(var trans = conn.BeginTransaction())
    {
        try
        {
            using(MySqlCommand cmd = new MySqlCommand())
            {
                // Clear the current summary entries
                cmd.Connection = conn;
                cmd.CommandText = "DELETE FROM summaryTable WHERE projectID = @Id";
                cmd.Parameters.AddWithValue("@Id", id);
                cmd.ExecuteNonQuery();
                cmd.Parameters.Clear();
            }

            // Write new entries
            foreach(SummaryObject record in summaryList)
            {
                using(MySqlCommand cmd = new MySqlCommand())
                {
                    cmd.Connection = conn;
                    cmd.CommandText = "INSERT INTO summaryTable VALUES(/*All values here*/)";
                    // Add With Value statements
                    cmd.ExecuteNonQuery();
                    cmd.Parameters.Clear();
                }
            }
        }
        catch(MySqlException e)
        {
            try
            {
                // try roll back
            }
            catch(MySqlException e1)
            {
                // Catch rollback fail
            }
        }
    }
    conn.Close();
}

我已经缩短了一些内容,但我知道 SQL 语句可以工作,因为我在将其更改为事务之前对它们进行了较早的测试。

【问题讨论】:

  • 你有自动提交设置吗?还是您只是在事务结束时错过了提交?
  • 不。我错过了提交。现在可以了。 (您应该将其作为答案而不是评论,@TheChaos)
  • 看来你最后错过了trans.Commit();。您正在创建一个事务,然后将其处理掉。

标签: c# mysql transactions


【解决方案1】:

您必须使用 Commit 或 Rollback 方法显式提交或回滚事务。Source

因此,放

trans.Commit();

在你的 try 块的末尾。

【讨论】:

  • 谢谢。真是愚蠢的错误——我第一次写其中一个,在我查看的示例中我一定忽略了这一点。
【解决方案2】:

您似乎错过了事务的提交。如果没有自动提交,数据库会回滚 -> 不会更改任何数据。

【讨论】:

    【解决方案3】:

    您似乎没有提交交易

    using(var conn = new MySqlConnection(connectionString))
    {
        conn.Open();
        // Use transaction to get all or nothing
        using(var trans = conn.BeginTransaction())
        {
            try
            {
                ......
                trans.Commit();
            }
            catch(MySqlException e)
            {
                trans.Rollback();
            }
        }
        // conn.Close(); NOT NEEDED
    }
    

    请注意,在连接的使用中包含 try/catch 要求您在出现异常时显式回滚。如果您在连接的 using 块之外设置了 try/catch,则可以避免回滚,因为在不提交的情况下关闭连接相当于自动回滚

    MySqlTransaction trans;
    try
    {
        using(var conn = new MySqlConnection(connectionString))
        {
            conn.Open();
            using(trans = conn.BeginTransaction())
            {
                ......
                trans.Commit()
            }
        }
    }
    catch(MySqlException e)
    {
        // NOT NEEDED => gives error 
        // trans.Rollback();
    }
    

    【讨论】:

    • 不错的编辑。我确实像你一样在连接内部有 try/catch,以及在连接失败的情况下所有这些之外的一个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 2017-05-03
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    相关资源
    最近更新 更多