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은 두 개 이상의 트랜잭션이 서로 잠금을 기다리며 무한 대기 상태에 빠질 때 발생한다.
- 이를 방지하려면
- 잠금을 획득하는 순서를 일정하게 유지한다.
- 트랜잭션을 짧게 유지하고, 불필요한 잠금을 피한다.
잠금 경합(Lock Contention) 문제
- 잠금 경합은 여러 트랜잭션이 동일한 리소스를 동시에 요청할 때 발생한다.
- 이를 해결하려면
- 쿼리를 최적화하여 잠금 시간이 최소화되도록 한다.
- 필요한 최소 범위의 리소스만 잠급니다.
출처
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.