Несколько запросов в рамках транзакции PHP->MySQL

94
22 ноября 2020, 08:20

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). Какой код и логика обработки ошибок будут оптимальными?

Answer 1

В упрощенном виде можно использовать такую схему:

$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;
}
READ ALSO
NotFoundHttpException in RouteCollection.php

NotFoundHttpException in RouteCollection.php

Не получается вывести заголовки категорий Laravel

123
Написать функцию на PHP

Написать функцию на PHP

Создать 3 переменныеДве из них должны содержать число

105
При запуске php artisan db:seed выбивает ошибку [закрыт]

При запуске php artisan db:seed выбивает ошибку [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

112