Проблемы с использованием транзакций MySQL с циклами в PHP
Я пытаюсь настроить транзакцию MySQL таким образом, чтобы я мог выполнить цикл из нескольких запросов (см. Ниже), и если какой-либо из них завершится неудачей, откатите все изменения. Однако я обнаружил, что в случае сбоя не все запросы откатываются. Я делаю здесь что-то не так?
mysql_query("START TRANSACTION");
foreach($array1 as $arr){
// loop SQL query
if(mysql_error()){
$failed = "...";
}
}
foreach($array2 as $arr){
// loop SQL query
if(mysql_error()){
$failed = "...";
}
}
if(isset($failed)){
mysql_query("ROLLBACK");
} else {
mysql_query("COMMIT");
}
Спасибо!
2 answers
Причина в том, что в случае сбоя запроса (из-за ошибки) транзакция автоматически откатывается и завершается. Поэтому вы должны прекратить цикл, если запрос завершается неудачно, потому что все, что выполняется после неудачного запроса, будет автоматически зафиксировано (или, по крайней мере, будет в другой транзакции, если AUTOCOMMIT
выключено)...
Используете ли вы тип таблицы, безопасный для транзакций? MyISAM по умолчанию не поддерживает транзакции, я рекомендую использовать InnoDB.