使用MySqlTransaction回滚

时间:2011-10-27 17:34:46

标签: c# mysql transactions

我有一个使用MySql 5.1.53和MySql Connector / Net 6.4.4的Visual Studio 2008 C#.NET 3.5项目。

'protocol_version', '10'
'version', '5.1.53-community-log'
'version_comment', 'MySQL Community Server (GPL)'
'version_compile_machine', 'unknown'
'version_compile_os', 'Win64'

我在我的数据库中创建了一个表格。

using (MySqlConnection c = new MySqlConnection(connection_string))
{
    c.Open();
    using (MySqlCommand cmd = c.CreateCommand())
    using (MySqlTransaction xt = c.BeginTransaction())
    {
        cmd.Connection = c;
        cmd.Transaction = xt;
        try
        {
            cmd.CommandText =
                @"CREATE TABLE `my_table` (
                  ...
                ) ENGINE=InnoDB AUTO_INCREMENT=72 DEFAULT CHARSET=latin1";
            cmd.ExecuteNonQuery();

            throw new System.Exception("This is a simulated failure!!!");

            xt.Commit();
        }
        catch
        {
            xt.Rollback();
            throw;
        }
    }
}

但是,在模拟失败后,该表仍然存在于我的数据库中。

我需要做些什么才能使交易正确回滚?

1 个答案:

答案 0 :(得分:3)

Create Table语句会导致自动提交。它不参与交易。

请参阅Statements That Cause an Implicit Commit

  

本节中列出的陈述(以及它们的任何同义词)   隐式结束事务,就好像之前已经完成了一个COMMIT   执行声明。

在您的情况下,如果发生异常,您可以删除表。它在技术上不是回滚,但它应该符合你的目的。

顺便说一句,你不需要一个try catch块。如果在不调用Commit

的情况下调用dispose,则会自动回滚事务