为什么获胜';t我的事务对数据库进行更改
本文关键字:数据库 事务 我的 获胜 为什么 | 更新日期: 2023-09-27 18:29:57
我正在编写一个需要更新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语句是有效的,因为在将其更改为事务之前,我已经对它们进行了测试。
必须使用commit或Rollback方法显式提交或回滚事务来源
因此,将
trans.Commit();
在你的试块结束时。
您似乎错过了事务的提交。在没有自动提交的情况下,数据库会进行回滚->不会更改任何数据。
您似乎没有提交交易
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();
}