반응형
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스테이트먼트, 테이블 잠금testU1를 실행합니다.INSERT진술U1를 실행합니다.COMMIT스테이트먼트, 테이블 잠금 해제testU2를 실행합니다.SELECT스테이트먼트, 신규 읽기MAX(id)그 후INSERT의U1U2를 실행합니다.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
반응형
'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 |