- DB Lock을 처음 경험한 날2025년 03월 18일
- 31514
- 작성자
- 2025.03.18.:02
나의 업무 중에 특정 CSV 파일을 읽어, 데이터를 파싱하고 테이블에 풀리프레쉬 방식으로 삽입하는 작업이 있다.
백엔드 개발자의 요청으로 해당 스크립트를 실행했는데, 데드락에 걸리는 상황이 발생했다.
일단 원인은 나의 스크립트 안에 테이블을 삭제하고 다시 생성하는 코드가 포함되어 있는데, 이 타이밍에 백엔드 개발자가 데이터를 조회했기 때문에 락(Lock)이 발생했다.
위 이미지는 `t_pole_image`라는 테이블에 `AccessExclusiveLock`이 걸린 모습이다.
`AccessExclusiveLock`은 가장 강력한 테이블 락(Lock)으로, 해당 테이블의 모든 작업을 차단한다.
빨간색 박스 안에 있는 두 줄을 살펴보면, 하나의 세션에서는 `AccessExclusiveLock`을 획득(`granted = t`)했지만,
다른 세션에서는 획득하지 못한 상태인 것을 확인할 수 있다.
따라서 여러 세션에서 동시에 이 Lock을 획득하려고 시도했기 때문에 교착 상태(Dead Lock)이 발생한거다.
이를 해결하기 위해서 postgres가 실행되고 있는 Docker Container를 재시작했다.
나머지 `RowShareLock`과 `AccessShareLock`에 대해서 간단하게 설명하면 다음과 같다.
- `RowShareLock`: 특정 행에 대한 변경을 방지하지만, 읽기는 허용한다.
- `AccessShareLock`: 다른 트랜잭션이 읽는 것은 가능하지만, 테이블 구조 변경은 금지한다.
'개발' 카테고리의 다른 글
LATERAL JOIN에 대해 알아보자. (0) 2025.03.17 SQLAlchemy와 psycopg2 중 어느 것을 사용할까? (0) 2025.03.06 Pandas의 벡터 연산 (0) 2025.03.06 Chunk를 사용하여 대용량 파일 전송하기 (0) 2025.01.17 Synology Active Backup for Business 사용법 (Windows) (0) 2025.01.06 다음글이전글이전 글이 없습니다.댓글
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)