我有一个使用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;
}
}
}
但是,在模拟失败后,该表仍然存在于我的数据库中。
我需要做些什么才能使交易正确回滚?
答案 0 :(得分:3)
Create Table语句会导致自动提交。它不参与交易。
请参阅Statements That Cause an Implicit Commit
本节中列出的陈述(以及它们的任何同义词) 隐式结束事务,就好像之前已经完成了一个COMMIT 执行声明。
在您的情况下,如果发生异常,您可以删除表。它在技术上不是回滚,但它应该符合你的目的。
顺便说一句,你不需要一个try catch块。如果在不调用Commit
的情况下调用dispose,则会自动回滚事务