programing

MariaDB SELECT가 다른 트랜잭션이 완료될 때까지 대기하도록 합니다.

nicescript 2022. 9. 28. 22:15
반응형

MariaDB SELECT가 다른 트랜잭션이 완료될 때까지 대기하도록 합니다.

저는 MariaDB 10.6.5에 있으며 다음 코드를 가지고 있습니다.

$pdo->query("SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;");
$pdo->query("SET autocommit = 0;");

try
{
    $max_id = $pdo->query("SELECT MAX(id) FROM test")->fetchColumn();
    sleep(3);
    $insert_sql = $pdo->prepare("INSERT INTO test(test) VALUES(:test)");
    $insert_sql->execute(['test' => $max_id + 1]);
}
catch (Throwable $e)
{
    $pdo->query("ROLLBACK;");
}

$pdo->query("COMMIT;");

test테이블에는 다음 두 개의 열이 있습니다.id(자동 증가) &test(int).

두 명의 사용자가 동시에 이 코드를 실행할 때 첫 번째 트랜잭션은 이 코드를 잠글 수 있도록 합니다.test의 테이블SELECT스테이트먼트 및 두 번째 트랜잭션이 다음에서 대기하는 경우SELECT스테이트먼트를 작성해야 합니다.모든 게 잘 되면id컬럼은 항상 같은 값이어야 합니다.test기둥.

이게 가능합니까?그렇다면 어떻게?

자세한 내용은 다음과 같습니다.

  • 2명의 사용자U1그리고.U2이 코드를 동시에 실행합니다.U1몇 마이크로초 전에 실행하다
  • U1를 실행합니다.SELECT스테이트먼트, 테이블 잠금test
  • U1를 실행합니다.INSERT진술
  • U1를 실행합니다.COMMIT스테이트먼트, 테이블 잠금 해제test
  • U2를 실행합니다.SELECT스테이트먼트, 신규 읽기MAX(id)그 후INSERTU1
  • U2를 실행합니다.INSERT진술
  • U2를 실행합니다.COMMIT진술

사용할 수 있습니다.GET_LOCK

쿼리를 추가하다DO GET_LOCK('lockname', 30)처음에 그리고DO RELEASE_LOCK('lockname')쿼리 후.

따라서 사용자 1이 쿼리를 시작할 때 잠금이 설정됩니다.locknameUser 2 가 스크립트를 기동했을 경우, 종료시에만 해방됩니다.DO GET_LOCK('lockname', 30)계속하기 전에 잠금이 해제될 때까지 기다립니다.

언급URL : https://stackoverflow.com/questions/72800694/mariadb-make-select-wait-for-other-transactions-to-finish

반응형