Откат не работает в C # - PullRequest
       5

Откат не работает в C #

1 голос
/ 26 января 2012

Я использую C # и MYSQL, а откат не работает.У меня есть три оператора удаления, где таблица третий удалить SQL не существует, и в перехват я делаю откат, но это происходит только для третьего, в то время как

         string id = dataGridView1.Rows[index].Cells[0].Value.ToString();
         string strDelete = "DELETE FROM user WHERE id = " + id;
         OdbcTransaction transaction = null;
         OdbcCommand cmd = new OdbcCommand();
         cmd.Connection = Singleton.Instance.GetConnection();
         transaction = Singleton.Instance.GetConnection().BeginTransaction();
         cmd.Transaction = transaction;
         try
         {
             cmd.CommandText = strDelete;
             cmd.ExecuteNonQuery();
             // delete from userdata
             strDelete = "DELETE FROM userdata WHERE id = " + id;
             cmd.CommandText = strDelete;
             cmd.ExecuteNonQuery();
             // delete from usersystem
             strDelete = "DELETE FROM usersystem WHERE id = " + id;
             cmd.CommandText = strDelete;
             cmd.ExecuteNonQuery();
             // delete from user systemstatus. here table don't exists, will throw 
             // exception 
             strDelete = "DELETE FROM usersystemstatusAAAA WHERE id = " + id;
             cmd.CommandText = strDelete;
             cmd.ExecuteNonQuery();
             transaction.Commit();
         }
         catch (Exception ex)
         {
             // Attempt to roll back the transaction.
             try
             {
                 transaction.Rollback();
             }
             catch (Exception ex2)
             {
                 Console.WriteLine("  Message: {0}", ex2.Message);
             }

         }

Здесь первые два оператора SQL фиксируются в то время как предполагается откатвсе.

Ответы [ 2 ]

4 голосов
/ 26 января 2012

Вам необходимо проверить тип хранилища вашей базы данных MySQL.Не все хранилища являются транзакционными.Например, InnoDB имеет транзакции, а MyISAM - нет.

MyISAM против InnoDB MyISAM против InnoDB

2 голосов
/ 26 января 2012

Я подозреваю, что у вас есть второе соединение, и возникла путаница по поводу соединения / транзакции / команды;попробуйте запустить транзакцию для соединения, которое вы фактически используете вместо этого:

cmd.Connection = Singleton.Instance.GetConnection();
transaction = cmd.Connection.BeginTransaction();

также, вы можете посмотреть using блоки здесь.

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