포스트

PostgreSQL Lock

PostgreSQL Lock 이란?

  • 데이터베이스에서 Lock은 여러 프로세스가 동시에 동일한 데이터에 접근할 때 발생할 수 있는 충돌을 방지하는 데 사용된다.
  • PostgreSQL에서는 잠금을 통해 데이터의 일관성과 무결성을 유지하며, 동시에 가능한 높은 성능을 제공한다.

PostgreSQL에서의 Lock 종류

ROW LEVEL LOCK

  • 행 단위로 설정되는 잠금
  • FOR UPDATE: 선택한 행을 업데이트할 때 사용
  • FOR SHARE: 다른 트랜잭션이 읽을 수 있지만 수정할 수 없도록 설정

TABLE LEVEL LOCK

  • 테이블 단위로 설정되는 잠금
  • ACCESS SHARE: 데이터를 읽을 때 사용
  • ACCESS EXCLUSIVE: 데이터 읽기/쓰기 모두 차단
  • ROW EXCLUSIVE: 테이블의 특정 행에 대해 업데이트를 수행할 때 설정

Lock의 동작 원리

  • PostgreSQL의 Lock은 트랜잭션 단위로 작동한다.
  • 트랜잭션이 완료되거나 롤백될 때까지 유지된다.
  • 이 메커니즘은 데이터 충돌을 방지하는 데 매우 유용하다.
  • 그러나 잠금이 과도하게 발생하면 성능 저하와 데드락(Deadlock) 같은 문제가 발생할 수 있다.

Lock 확인 방법

  • 잠금 상태를 확인하려면 PostgreSQL에서 제공하는 pg_locks 뷰를 사용할 수 있다.
SELECT * FROM pg_locks;
  • 여기서 locktype, relation, mode, granted 등의 필드를 통해 현재 활성화된 잠금을 분석할 수 있다.

Lock 사용 예시

행 잠금 예제

  • 다음은 FOR UPDATE를 사용하여 특정 행을 잠그는 예제
BEGIN;
SELECT * FROM employees WHERE id = 1 FOR UPDATE;
-- 다른 트랜잭션에서 해당 행에 접근하면 대기 상태가 된다.

테이블 잠금 예제

  • 테이블 전체에 배타적 잠금을 설정하는 예제
BEGIN;
LOCK TABLE employees IN ACCESS EXCLUSIVE MODE;
-- 다른 트랜잭션은 해당 테이블에 접근할 수 없다.

Lock 관련 문제 해결 하는 방법

Deadlock 문제

  • Deadlock은 두 개 이상의 트랜잭션이 서로 잠금을 기다리며 무한 대기 상태에 빠질 때 발생한다.
  • 이를 방지하려면
    1. 잠금을 획득하는 순서를 일정하게 유지한다.
    2. 트랜잭션을 짧게 유지하고, 불필요한 잠금을 피한다.

잠금 경합(Lock Contention) 문제

  • 잠금 경합은 여러 트랜잭션이 동일한 리소스를 동시에 요청할 때 발생한다.
  • 이를 해결하려면
    1. 쿼리를 최적화하여 잠금 시간이 최소화되도록 한다.
    2. 필요한 최소 범위의 리소스만 잠급니다.

출처

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.