2012-01-26 2 views
1

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

  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 заявления совершаются в то время как предполагают, чтобы откатить все.

+0

Вы используете MyISAM или InnoDB в качестве двигателя для хранения? Выполняется ли откат при его выполнении в SQL? – Sjoerd

ответ

4

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

MyISAM в сравнении с InnoDB MyISAM versus InnoDB

2

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

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

также, вы можете захотеть взглянуть на using блоков здесь.

+0

Я тестировал, но его тоже не сработало. – CrazyC

+0

@CrazyC хорошо ... согласно другим комментариям ... ваше хранение фактически транзакционное? –

+0

жаль спрашивать, как я могу проверить его? – CrazyC

Смежные вопросы