DB Lock 이해하기

정한빈·2022년 5월 1일
0
post-thumbnail

PostgreSQL에서는 동시성 제어를 위해 여러가지 모드의 lock을 제공합니다. 이런 lock에도 여러가지 종류가 있고, 명시적으로 사용되는 경우/묵시적으로 사용되는 경우가 있는데, 자세히 알아보도록 합시다.

시작하기 전 3줄요약

  1. Lock이 미치는 범위를 level로 나눈다
  2. Lock 모드별로 충돌하는 관계가 존재한다
  3. Lock은 트랜잭션 종료 시 혹은 롤백시에 풀린다.

lock이 미치는 범위를 Level로 나누는데, Table-Level Lock, Row-Level Lock, Page-Level Lock, Database-Level Lock 까지 다양하게 존재합니다.
해당 글에서는 Table-Level LockRow-Level Lock 에 대해서만 설명하겠습니다.

Table-Level Lock

Table Level Lock은 테이블 수준에 락을 거는 방법입니다. 만약 테이블 내에 100개의 로우가 있다고 하면 하나의 로우에 접근하는 동안 나머지 99개의 로우에 접근 할 수 없기 때문에, 다중 사용자 환경에서는 사용하지 않는 편이 좋습니다. (보통 테이블 전체 로우의 변경이 있는 DDL 구문과 함께 사용됩니다. (ex) TRUNCATE, ALTER))

이런 Table Level Lock은 LOCK 명령어를 이용해서 명시적으로 걸어줄 수도 있지만,
우리가 특정 쿼리문을 사용할 때 마다 암묵적으로 걸리게 됩니다. 어느 상황에 어느 락이 걸리는 지는 해당 문서를 보면 알 수 있습니다.

Row-Level Lock

Row-Level Lock은 row 수준에 락을 거는 방법입니다.

SELECT ~ FOR SHARE과 같은 DML 구문과 함께 가장 자주 사용되는 Lock입니다.


만약 이런 Lock 종류가 하나밖에 없다면, 여러 종류의 트랜잭션에서 lock을 알맞게 사용하기 어려워지는데요,
이런 상황을 처리하기 위해 Lock에는 Lock모드라는 것이 존재합니다.

Lock 모드?

Lock 모드 별로 서로 충돌하는 Lock 모드가 있으며,
충돌한다면 해당 리소스(table, row)에 동시에 접근할 수 없게 됩니다.
ex)

  • ACCESS SHARE락은 ACCESS EXCLUSIVE 락과 충돌한다,
  • ROW SHARE락은 EXCLUSIVE, ACCESS EXCLUSIVE 락과 충돌한다

Table-Level Lock에는ACCESS SHARE, ROW SHARE 등,
Row-Level Lock에는 FOR UPDATE, FOR UPDATE 등 여러가지 Lock 모드가 존재합니다.
이런 모드들의 이름은 일반적으로 사용되는 경우를 나타내지만, 모드마다 기능적으로 다른 점은 없습니다.

각 모드마다 차이점은 오직 "어떤 모드의 lock과 충돌하는가" 입니다.
부연설명하자면 충돌하는 lock 모드의 종류가 다른 것이 차이점이라고 볼 수 있겠습니다.

이런 lock 모드별 충돌되는 경우는 아래의 표를 보고 확인할 수 있습니다.

Table-Level Lock Mode

Row-Level Lock Mode


Ref

Chapter 13. Concurrency Control

0개의 댓글