MySQL 5.7.25. БД с таблицами InnoDB. Необходимо из PHP выполнить 3 запроса к БД в рамках одной транзакции. Т.е. либо все, либо ничего:
TRUNCATE TABLE table1;
INSERT INTO table1 VALUES (...);
UPDATE table2 SET col1=(SELECT c FROM table1 WHERE...);
Как правильнее поступить:
1) Использовать $mysqli->multi_query($db_query). И передать все три запроса в переменную $db_query?
2) каждый запрос выполнять отдельно $mysqli->query($db_query) и отслеживать каждый результат вывполения?
Если не трудно, приведите, пожалуйста, полный код с указанием начала транзации, подтверждения (commit) и отката при ошибке на любом этапе (rollback). Какой код и логика обработки ошибок будут оптимальными?
В упрощенном виде можно использовать такую схему:
$mysqli->query('START TRANSACTION');
try {
if(false === $mysqli->query('TRUNCATE TABLE table1')) {
throw new RuntimeException($mysqli->error);
}
if(false === $mysqli->query('INSERT INTO table1 VALUES (...)')) {
throw new RuntimeException($mysqli->error);
}
if(false === $mysqli->query('UPDATE table2 SET col1=(SELECT c FROM table1 WHERE...)')) {
throw new RuntimeException($mysqli->error);
}
if(false === $mysqli->query('COMMIT')) {
throw new RuntimeException($mysqli->error);
}
} catch (Exception $e) {
$mysqli->query('ROLLBACK');
echo $e->message;
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском