sourcecode

TRANSACTION 블록 MySQL 외부에서 삽입 실행

copyscript 2022. 11. 7. 22:40
반응형

TRANSACTION 블록 MySQL 외부에서 삽입 실행

를 실행할 수 있습니까?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개입니다.각 에러는 다릅니다.

플랜 C: 로깅 오류에 대해서만 MySQL에 대한 두 번째 연결을 사용합니다.

이와 관련하여,autocommit=ON없이.BEGIN..COMMIT이렇게 하면 '로그' 레코드가 즉시 삽입됩니다.

스택에서 오류를 푸시하고 나중에 저장하는 것은 어떻습니까?

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

언급URL : https://stackoverflow.com/questions/55141922/run-insert-outside-of-transaction-block-mysql

반응형