在TRANSACTION块MySQL外部运行插入

时间:2019-03-13 12:28:12

标签: php mysql mariadb

是否可以在access_control之外运行access_control: - { path: ^/$, role: ROLE_BASE_USER } 命令?

我需要这样做,因为我正在记录数据库中的所有错误,并且即使发生错误也应回滚其他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命令之后,但是可以想象一下,在50个可能发生错误的地方,每个错误都不同。 / p>

2 个答案:

答案 0 :(得分:2)

方案C:使用第二条与MySQL的连接只是为了记录错误。

在这种情况下,请使用autocommit=ON而不使用BEGIN..COMMIT。这样,将立即插入“日志”记录。

答案 1 :(得分:1)

如何将错误推送到堆栈中并稍后保存?

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");
}