Использование MySqlTransaction для отката - PullRequest
1 голос
/ 27 октября 2011

У меня есть проект Visual Studio 2008 C # .NET 3.5, использующий MySql 5.1.53 и MySql Connector / Net 6.4.4.

'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 Ответ

3 голосов
/ 27 октября 2011

Оператор Create Table вызывает автоматическую фиксацию. Не участвует в транзакции.

См. Заявления, которые вызывают неявную фиксацию

утверждения, перечисленные в этом разделе (и любые синонимы к ним) неявно завершить транзакцию, как если бы вы сделали COMMIT до выполнение заявления.

В вашем случае вы можете просто отбросить таблицу, если возникнет исключение. Технически это не откат, но он должен служить вашей цели.

Кстати, вам не нужен блок try catch. Транзакция откатывается автоматически, если для нее вызывается dispose без вызова Commit

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...