我正在编写一个需要更新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语句可以正常工作,因为我之前已经测试过它们,然后才将其更改为事务。
答案 0 :(得分:3)
答案 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)
您似乎错过了交易的提交。如果没有自动提交,数据库会进行回滚 - >没有数据会被更改。