programing

Mariadb SELECT는 잠금 시 실패하지 않습니다.

topblog 2023. 8. 6. 09:04
반응형

Mariadb SELECT는 잠금 시 실패하지 않습니다.

읽으려는 레코드가 잠겨 있으면 'SELECT' 쿼리가 실패하도록 하려고 합니다.
시뮬레이션을 위해 UPDATE에서 20초간 잔 다음 스레드 하나에서 자는 트리거를 추가했습니다(자바 애플리케이션).레코드(oid=53)를 업데이트하고 있으며 다른 스레드에서 다음 쿼리를 수행하고 있습니다.

"SET STATION max_statement_time=1 FOR SELECT * Jobs j.oid =53"

(참고: mariadb 서버 버전이 10.2이므로 "SELECT ... NOWAIT" 옵션을 사용할 수 없으며 대신 "SET STATION max_statement_time=1 FOR ..."을 사용해야 합니다.)

레코드가 업데이트 중이므로 SELECT가 실패하고 읽기/쓰기 잠금이 되어야 하지만 SELECT는 성공합니다.SELECT 쿼리에 'for update(업데이트용)'를 추가한 경우에만 쿼리가 실패합니다. (하지만 이것은 나에게 좋은 옵션이 아닙니다.)
이 시간 동안 INNODB_LOCKs 테이블을 확인했는데 비어 있었습니다.
IN IN IN IN NODB_TRX 표 분리 수준 – 반복 가능 읽기 트랜잭션을 보았습니다. 하지만 여기서 관련이 있는지 모르겠습니다.
어떻게 하면 '업데이트용'으로 만들지 않고 SELECT를 실패시킬 수 있습니까?

일반적으로 일관된(그리고 더티한) 읽기는 잠금이 되지 않으며 트랜잭션 격리 수준에 따라 스냅샷을 읽을 뿐입니다.동시 트랜잭션이 완료될 때까지 읽기를 기다리려면 분리 수준을 다음과 같이 설정해야 합니다.SERIALIZABLE 읽기를 수행하는 연결에서 자동 커밋을 해제합니다.비슷한 것

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET autocommit = 0;
SET STATEMENT max_statement_time=1 FOR ...

해야 합니다.

MariaDB KB의 관련 페이지

참고: 제 개인적인 선호는 다음과 같습니다.innodb_lock_wait_timeout=1대신에max_statement_time=1둘 다 진술을 실패하게 만들겠지만,innodb_lock_wait_timeout상황에 더 적합한 오류 코드가 발생합니다.

언급URL : https://stackoverflow.com/questions/45238398/mariadb-select-not-failing-on-lock

반응형