C# 为什么赢了';我的事务不能对数据库进行更改吗?
我正在编写一个需要更新MySQL数据库的应用程序。我现在正在做的是从表中删除行,然后插入新数据,因此我使用事务来确保我得到所有更改或没有更改。然而,没有任何改变,我也不明白为什么,因为没有抛出异常 以下是事务的代码片段:C# 为什么赢了';我的事务不能对数据库进行更改吗?,c#,mysql,transactions,C#,Mysql,Transactions,我正在编写一个需要更新MySQL数据库的应用程序。我现在正在做的是从表中删除行,然后插入新数据,因此我使用事务来确保我得到所有更改或没有更改。然而,没有任何改变,我也不明白为什么,因为没有抛出异常 以下是事务的代码片段: using(var conn = new MySqlConnection(connectionString)) { conn.Open(); // Use transaction to get all or nothing using(var trans
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();
在try块的末尾
必须使用commit或Rollback方法显式提交或回滚事务
因此,提出
trans.Commit();
在try块的末尾。您似乎没有提交事务
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();
}
您似乎没有提交您的事务
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();
}
您似乎错过了事务的提交。如果没有自动提交,数据库将执行回滚->不会更改任何数据。您似乎错过了事务的提交。如果没有自动提交,数据库将执行回滚->不会更改任何数据。是否有自动提交设置?或者您只是错过了事务结束时的提交?没有。我错过了承诺。现在可以了。(你应该回答而不是评论,@TheChaos)似乎你缺少
trans.Commit()代码>在末尾。您正在创建事务,然后处理它。是否有自动提交设置?或者您只是错过了事务结束时的提交?没有。我错过了承诺。现在可以了。(你应该回答而不是评论,@TheChaos)似乎你缺少trans.Commit()代码>在末尾。您正在创建一个事务,然后处理它。谢谢。真是愚蠢的错误——这是我第一次写这样的文章,我一定是在我看的例子中忽略了这一点。谢谢。真是愚蠢的错误——这是我第一次写这些东西,我一定是在我看的例子中忽略了这一点。编辑得不错。我和你一样在连接内部有try/catch,如果连接失败,在所有连接之外也有try/catch。编辑得不错。我和您一样,在连接内部有try/catch,如果连接失败,在所有连接之外也有try/catch。