Lock 이란 트랜잭션 처리의 순차성을 보장하기 위한 방법이다.
Lock 의 종류에도 공유 Lock 과 베타 Lock 이 있다.
공유 Lock 은 데이터를 읽을 때 사용되어지는 Lock 으로 하나의 데이터를 읽는 것은 여러 사용자가 동시에 할 수 있다.
베타 Lock은 데이터를 변경하고자 할 때 사용되며 트랜잭션이 완료될 때까지 유지된다.
베타 Lock 은 락이 해제될 때까지 다른 트랜잭션은 해당 리소스에 접근할 수 없는 것이다.
나의 경우 베타 락이 걸려있는 것 같았다.
아래 내용을 락을 해제하고 트랜잭션을 다시 사용할 수 있도록 하는 방법이다.
DB 는 Postgresql을 사용했다.
현재 수행중인 SQL 전체 조회
select datname, pid, usename, application_name, client_addr, client_port, backend_start, query_start, wait_event_type, state, backend_xmin query from pg_stat_activity;
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 테이블은 괜찮으나 RowExclusiveLock 이 검색된다면 해당 테이블에 접근이 지연되어 다른 쿼리에도 영향을 미칠 수 있으므로 반드시 잡고있는 트랜잭션이나 서버 상태 등을 점검하여 lock을 해제 해 주는 작업이 필요하다.
lock 해제
select pg_cancel_backend(pid);
반응형
'프로그래밍 언어 > DB' 카테고리의 다른 글
[postgresql] dt did not find any relations (0) | 2021.11.15 |
---|---|
postgresql 테이블 데이터 모두 삭제 (truncate) (0) | 2021.11.15 |
[mysql] cannot check if timestamp is between varchar(23) and varchar(23) - 날짜 조회 쿼리 (0) | 2021.09.28 |
select limit ? offset ? (페이징 활용) (0) | 2021.09.23 |
[SQL] COALESCE , LEAD, LAG 함수 (NULL이 아닌 첫번째 값, 이전값, 다음값) (0) | 2021.07.30 |