반응형
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)
그 후INSERT
의U1
U2
를 실행합니다.INSERT
진술U2
를 실행합니다.COMMIT
진술
사용할 수 있습니다.GET_LOCK
쿼리를 추가하다DO GET_LOCK('lockname', 30)
처음에 그리고DO RELEASE_LOCK('lockname')
쿼리 후.
따라서 사용자 1이 쿼리를 시작할 때 잠금이 설정됩니다.lockname
User 2 가 스크립트를 기동했을 경우, 종료시에만 해방됩니다.DO GET_LOCK('lockname', 30)
계속하기 전에 잠금이 해제될 때까지 기다립니다.
언급URL : https://stackoverflow.com/questions/72800694/mariadb-make-select-wait-for-other-transactions-to-finish
반응형
'programing' 카테고리의 다른 글
문자열에서 선두 문자를 제거하려면 어떻게 해야 합니까? (0) | 2022.09.30 |
---|---|
업데이트된 열 값을 수동으로 수정할 때 HeidiSQL Before Update 트리거 오류 발생 (0) | 2022.09.30 |
python 예외 메시지 캡처 (0) | 2022.09.28 |
Python json.loads에 ValueError: 추가 데이터가 표시됩니다. (0) | 2022.09.28 |
스위치 스테이트먼트에서 복귀하는 것이 브레이크 사용보다 더 좋은 방법이라고 생각하십니까? (0) | 2022.09.28 |