2016-10-09 2 views
0

У меня возникла проблема с транзакцией, отправленной из инфраструктуры Yii (с использованием PDO) в базу данных InnoDB MySql, проблема была в том, что откат не работал, команда обновления сразу же выполняла транзакцию.Откат транзакций MySQL InnoDB не работает

  • Я попытался установить autoCommit явно, без везения.
  • Проверен общий журнал Mysql, только одно соединение открыто, с одной отправленной транзакцией отправлено, а затем только с одним откатом.
  • В общем журнале «Начало транзакции», «Откат» и инструкция обновления были получены из одного и того же потока клиентов.
  • Конец не обнаружен во всем журнале.
  • Пробовал пример отката от клиента mysql (MySQLWorkbench) и откат работал!

Проблема была в том, что MySql сразу же отправил сообщение, когда его отправили из приложения Yii, и я не знал почему.

По какой-то конкретной причине я просто попытался включить log_bin в my.cnf и откат работал!

Может кто-нибудь объяснить, что только что произошло?

Я использую MySql 5.6.25, с PHP 5.6.10 и Yii 1.1.14.

Update:

Оказывается, что я сделал ошибку, я думал, что откат работал после включения log_bin, но это не так.

Так что теперь я вернулся к исходной задаче, откат не работает, а вот исходный код:

$transaction = Yii::app()->db->beginTransaction(); 
try { 

    $data = array(); 
    // fill some data here.. 
    $model = Model::createOrUpdate($data); 

    $errors = $model->getErrors(); 

} catch (Exception $e) { 
    $errors []= $e->getMessage(); 
} 

if (empty($errors)) { 
    $msg = 'Success message!'; 
    $transaction->commit(); 
    echo CJSON::encode(array('success', $msg)); 
} else { 
    if ($transaction->active) { 
     $transaction->rollback(); 
    } 
    echo CJSON::encode(array('error', implode(', ', $errors))); 
} 

Yii::app()->end(); 
+0

Какие вопросы вы выполнили? MySQL не знает DDL-уровень-транзакции. – Christian

+0

Никаких DDL не было выполнено, это было просто заявление Update –

+0

показать свой код .. – scaisEdge

ответ

0

После некоторой отладки, я нашел причину этого. В основном метод:

Model::createOrUpdate($data); 

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

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