본문 바로가기

소프트웨어 이야기/데이터 저장소 + 시각화

(PotgreSQL) ROW SHARE Lock이란?

ROW SHARE Lock이란? 

Table Level Lock의 일종이다. Row라는 이름이 들어간다고 Row Lock이 아니다. 

SELECT FOR UPDATE, SELECT FOR SHARE 명령문을 날릴 때, 대상이 되는 테이블에 락을 잡는다. 

UPDATE, DELETE 명령문을 날릴 때, RowShareLock이 잡히는 경우도 있다. 


UPDATE / DELETE 명령문을 날릴 때, RowShareLock이 잡히는 케이스는 다음과 같다. 

aurthor의 id를 참조하고 있는 content 테이블이 있다고 가정해보자. 


CREATE TABLE authors (
  id serial NOT NULL PRIMARY KEY,
  name text NOT NULL
);

CREATE TABLE contents (
  id serial NOT NULL PRIMARY KEY,
  author_id int4 NOT NULL,
  name text NOT NULL,
  CONSTRAINT content_author_fk FOREIGN KEY (author_id) REFERENCES authors(id)
);



content에 Insert / Update를 할 때, author의 id를 추가 / 수정해주면, 참조되어있는 author의 row가 Row Share Lock이 잡히게 된다. 

이 때, 첫번째 트랜잭션이 커밋될 때까진, 다른 트랜잭션에서는 참조된 author row를 수정 / 삭제할 수 없다. 


-- Transaction 1
BEGIN;
INSERT INTO contents (author_id, name) VALUES (1, 'Content 2 Author 1');
-- Transaction 2
BEGIN;
DELETE FROM parent WHERE id = 1;


RowShareLock이 잡혔는지는 아래의 쿼리로 확인할 수 있다.

SELECT relation::regclass, mode, * FROM pg_catalog.pg_locks WHERE mode='RowShareLock';


[PostgresSQL] 13.3. Explicit Locking

Postgres Locking Revealed

Selecting for Share and Update in PostgreSQL