의외로 의식이 없는 PostgreSQL의 락에 대해서

개발에서 PostgreSQL을 이용하는 것은 자주 있군요.
하지만 록에 대해 확실히 이해하는 사람은 적다고 생각합니다.

PostgreSQL 잠금 유형



우선, PostgreSQL의 락에는 이하와 같은 락 레벨이 있습니다.
  • ACCESS SHARE
  • ROW SHARE
  • ROW EXCLUSIVE
  • SHARE UPDATE EXCLUSIVE
  • SHARE
  • SHARE ROW EXCLUSIVE
  • EXCLUSIVE
  • ACCESS EXCLUSIVE

  • 각각에 대한 자세한 내용은 공식 문서를 참조하십시오.
    htps //w w. 포스트g sql. jp / 도쿠 멘 t / 12 / html / 에 xp ぃし t ぉ c 킨 g. HTML

    자주 사용하는 SQL이라고 예를 들면,
    SELECT 문은 ACCESS SHARE, INSERT 및 UPDATE는 ROW EXCLUSIVE에 해당합니다.

    충돌하는 자물쇠



    자물쇠는 아래 표의 ☓가 부분이 충돌합니다.



    ACCESS SHARE
    ROW SHARE
    ROW EXCLUSIVE
    SHARE UPDATE EXCLUSIVE
    SHARE
    SHARE ROW EXCLUSIVE
    EXCLUSIVE
    ACCESS EXCLUSIVE


    ACCESS SHARE



    X

    ROW SHARE



    X
    X

    ROW EXCLUSIVE


    X
    X
    X
    X

    SHARE UPDATE EXCLUSIVE

    X
    X
    X
    X
    X

    SHARE

    X
    X
    X
    X
    X
    X

    SHARE ROW EXCLUSIVE

    X
    X
    X
    X
    X
    X

    EXCLUSIVE

    X
    X
    X
    X
    X
    X
    X

    ACCESS EXCLUSIVE
    X
    X
    X
    X
    X
    X
    X
    X


    ACCESS EXCLUSIVE 잠금 시 ACCESS SHARE의 실행이 잠기고 대기가 발생합니다.
    그러나 ROW EXCLUSIVE 잠금시 ACCESS SHARE 실행은 잠기지 않고 실행할 수 있습니다.

    실제로 실행해보기



    충돌없는 패턴


    BEGIN;
    
    INSERT INTO hoge VALUES (1, 'hoge');
    

    를 실행하고 잠금 상태를 보면 다음과 같이됩니다 (pgAdmin에서 확인하고 있습니다.)

    RowExclusiveLock로 잠겨있는 것을 알 수 있습니다.
    이 상태에서 다음을 실행하면 실행 가능한 것을 알 수 있습니다.
    실행할 때까지 실행했던 것과는 다른 세션에서 부탁합니다.
    SELECT * FROM hoge LIMIT 1;
    

    충돌있는 패턴


    BEGIN;
    
    TRUNCATE TABLE hoge;
    

    를 실행하고 잠금 상태를 보면 다음과 같습니다.

    이쪽은 AccessExclusiveLock가 되어 있는 것을 알 수 있다고 생각합니다.
    이 상태에서 방금 전과 같은 다음 SQL을 실행해보십시오.
    SELECT * FROM hoge LIMIT 1;
    

    아마도 즉시 실행되지 않을 것입니다.
    이 상태에서 잠그는 쪽 세션에서
    ROLLBACK;
    

    실행하면 SELECT 결과도 반환된다고 생각합니다.

    요약



    이렇게 평소 의외로 의식하지 않을지도 모릅니다만, 확실히 락 레벨이 있습니다.
    이것을 의식하고 개발하는 것은 중요하네요. 락 레벨을 의식적으로 올리고 싶은 경우 등은 명시적으로 락을 하는 것도 가능하므로 그 만큼도 의식해 갈 수 있으면 좋네요.

    좋은 웹페이지 즐겨찾기