본문 바로가기
Database & Bigdata/PostgreSQL

[PostgreSQL] Lock & Deadlock

by z.1nee 2022. 6. 9.
SMALL

Deadlock 

트랜잭션 교착상태

 

트랜잭션들이 서로가 잡고있는 Lock을 얻으려고 할 때, DeadLock이 발생

서로가 쥐고 있는 Lock을 얻어야지만, 트랜잭션이 끝날 수 있어 영원히 Transaction이 안끝나게 됨

그래서 트랜잭션 짤 때 DeadLock 안걸리게 순서를 잘 구성해야 함

 

 

 

Deadlock 테이블 확인

SELECT relation::regclass, * FROM pg_locks WHERE NOT granted;

 

 

 

 

 

Lock

Lock이란 트랜잭션 처리의 순차성을 보장하기 위한 방법

Lock의 종류로는 공유(Shared) Lock과 베타(Exclusive) Lock이 있음

 

1. Shared Lock(공유 Lock 또는 Read Lock): 데이터를 읽을 때 사용

내가 보고 있는 데이터는 다른 사용자가 볼 수 있지만, 변경은 불가

2) Exclusive Lock(배타적 Lock 또는 Write lock) : 데이터를 변경할 때 사용

해당 Lock이 해제되기 전까지는, 다른 Lock에 대한 설정을 할 수 없음 (즉, 읽기 쓰기가 불가능)

 

 

Lock 테이블 확인

SELECT t.relname, l.locktype, page, virtualtransaction, pid, mode, granted
FROM pg_locks l, pg_stat_all_tables t
WHERE l.relation = t.relid ORDER BY relation ASC;

 

Lock 쿼리 kill

select pg_cancel_backend(pid);
SELECT pg_terminate_backend(pid) FROM pg_stat_activity; #연계된 상위 쿼리까지 모두 중지
select * from pg_stat_activity; 	# 현재 실행중인 SQL

 

 

댓글