Запустите вставку вне блока транзакций MySQL - PullRequest
0 голосов
/ 13 марта 2019

Можно ли выполнить команду MySQL INSERT за пределами MySQL TRANSACTION?

Мне бы это понадобилось, потому что я регистрирую все ошибки в базе данных, и даже если другие MySQL запросы должны быть откатаны при возникновении ошибки, ошибка все равно должна быть вставлена ​​в базу данных.

Вот пример кода:

<?php

DB('main')->query("START TRANSACTION;");
$error = false;
for ($i=0; $i<10; $i++) {
   $rand = rand(0, 10);
   if ($rand < 5) {
       $error = true;
       DB('main')->query("INSERT INTO Errors SET ErrorText = 'There was an error'");
       break;
   }
   DB('main')->query("INSERT INTO RandomTable SET RandomValue = '" . $rand . "'");
}

if ($error) {
    DB('main')->query("ROLLBACK");
} else {
    DB('main')->query("COMMIT");
}

При использовании этого кода в случае ошибки строка в таблице Errors вообще не будет вставлена. Если я не использую TRANSACTIONS, мне придется вручную удалить все строки, которые были вставлены до того, как произошла ошибка.

Мне известно, что я мог бы просто и просто поставить INSERT ошибки после команды ROLLBACK, но представьте себе, с 50 местами, где может возникнуть ошибка, каждая ошибка отличается.

Ответы [ 2 ]

2 голосов
/ 18 марта 2019

План C: использовать второе подключение к MySQL только для регистрации ошибок.

В этой связи используйте autocommit=ON без BEGIN..COMMIT. Таким образом, записи «журнала» будут быстро вставлены.

1 голос
/ 13 марта 2019

Как насчет отправки ошибок в стек и последующего сохранения?

DB('main')->query("START TRANSACTION;");
$error = false;
$errors = [];
for ($i=0; $i<10; $i++) {
   $rand = rand(0, 10);
   if ($rand < 5) {
       $error = true;
       $errors[] = "There was an error with ".$rand;

       break;
   }
   DB('main')->query("INSERT INTO RandomTable SET RandomValue = '" . $rand . "'");
}

if ($error) {
    DB('main')->query("ROLLBACK");
    DB('main')->query("INSERT INTO Errors (ErrorText) values  (...)", $errors );
} else {
    DB('main')->query("COMMIT");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...