为什么我的交易不会对数据库进行更改?

时间:2014-11-10 14:27:39

标签: c# mysql transactions

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

以下是交易的代码段:

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语句可以正常工作,因为我之前已经测试过它们,然后才将其更改为事务。

3 个答案:

答案 0 :(得分:3)

  

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

因此,把

trans.Commit();

在你的试块结束时。

答案 1 :(得分:1)

您似乎没有提交交易

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需要在异常情况下显式回滚。如果您在连接的使用块之外设置了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();
}

答案 2 :(得分:1)

您似乎错过了交易的提交。如果没有自动提交,数据库会进行回滚 - >没有数据会被更改。

相关问题