[MySQL] NOWAIT & SKIP LOCKED

기훈·2024년 7월 15일

MySQL

목록 보기
6/23

SELECT FOR UPDATAE NOWAIT

  • 잠금 대상 레코드가 다른 세션에 잠겨있는 경우 대기가 아닌 바로 에러를 반환

  • innodb_lock_wait_timeout 옵션을 0으로 설정한 것과 유사한 효과 (기본값 50)

  • 트랜잭션 내에서 NOWAIT 쿼리를 실행하여 에러가 반환되더라도, 열어둔 트랜잭션은 유지됨

SELECT FOR UPDATAE SKIP LOCKED

  • 잠금 대상 레코드 중에 다른 세션에 의해 잠금이 걸려 있는 레코드는 스킵하고, 잠금이 걸려있지 않은 레코드를 잠그고 반환

  • 잠금 대상 레코드가 비 결정적으로 정해짐 (쿼리 실행지 어떤 레코드가 잠금이 걸릴지 예측이 어려움)

  • 잠금 대상 레코드들이 모두 잠겨있는 경우 빈 결과 반환 (상황에 따라서 Gap-Lock 점유)

  • ORDER BY & LIMIT 절과 함께 많이 사용됨

  • OneToMany 관계에서 조인을 통해 데이터를 조회할 때, 첫 번째 트랜잭션이 아직 커밋되지 않았다면, 두 번째 세션은 빈 결과를 반환할 수 있다. 이는 조인 대상 테이블에 잠금이 걸려 있기 때문이다.

  • 예시(단일 테이블)

  • 예시(조인)

0개의 댓글