의외로 의식이 없는 PostgreSQL의 락에 대해서
3552 단어 PostgreSQL자물쇠DB데이터베이스
하지만 록에 대해 확실히 이해하는 사람은 적다고 생각합니다.
PostgreSQL 잠금 유형
우선, PostgreSQL의 락에는 이하와 같은 락 레벨이 있습니다.
각각에 대한 자세한 내용은 공식 문서를 참조하십시오.
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 결과도 반환된다고 생각합니다.
요약
이렇게 평소 의외로 의식하지 않을지도 모릅니다만, 확실히 락 레벨이 있습니다.
이것을 의식하고 개발하는 것은 중요하네요. 락 레벨을 의식적으로 올리고 싶은 경우 등은 명시적으로 락을 하는 것도 가능하므로 그 만큼도 의식해 갈 수 있으면 좋네요.
Reference
이 문제에 관하여(의외로 의식이 없는 PostgreSQL의 락에 대해서), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kudota/items/3381e8a7d5f0b0caae3f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)