programing

반복 가능 읽기 트랜잭션을 사용하는 경우에도 MariaDB 여러 개의 동일한 행

lovejava 2023. 9. 1. 20:21

반복 가능 읽기 트랜잭션을 사용하는 경우에도 MariaDB 여러 개의 동일한 행

저는 MariaDB 서버와 약 500명의 일일 활성 사용자가 있는 nodejs 웹 서비스를 가지고 있습니다.

내 코드에서 나는 아래와 같은 트랜잭션을 사용합니다.

START TRANSACTION

-- select to find out the existence of a row --
-- if the row doesn't exist, a new row inserted --

COMMIT

이 트랜잭션은 중복 행을 삽입하지 않아야 하지만 삽입하지 않습니다.
세션이 다른 2개의 요청이 동시에 도착하여 행이 존재하지 않는 것을 확인한 후 두 세션이 모두 해당 행을 삽입할 때 발생하는 것으로 생각합니다.

MariaDB 트랜잭션 격리 수준은 반복 가능-읽기입니다.

이것은 반복 가능 읽기 분리 수준 때문입니까?

다른 세션이 동일한 행을 읽을 수 있을 때 읽기 및 쓰기를 독점적으로 잠그는 방법은 무엇입니까?

대신, 이것들 중 하나를 수행하십시오. 둘 중 하나는 '원자적'이고 필요하지 않습니다.BEGIN/COMMIT동일한 트랜잭션에 속하는 다른 문이 없는 한 다음과 같습니다.

INSERT IGNORE ...;

INSERT ... ON DUPLICATE KEY UPDATE ...;

우리 코드의 문제점을 설명하기 위해:당신은 했어야 했어요.FOR UPDATE에서SELECT.

언급URL : https://stackoverflow.com/questions/43844519/mariadb-multiple-identical-row-even-when-using-repeatable-read-transaction