나의 업무 중에 특정 CSV 파일을 읽어, 데이터를 파싱하고 테이블에 풀리프레쉬 방식으로 삽입하는 작업이 있다.
백엔드 개발자의 요청으로 해당 스크립트를 실행했는데, 데드락에 걸리는 상황이 발생했다.
일단 원인은 나의 스크립트 안에 테이블을 삭제하고 다시 생성하는 코드가 포함되어 있는데, 이 타이밍에 백엔드 개발자가 데이터를 조회했기 때문에 락(Lock)이 발생했다.

위 이미지는 `t_pole_image`라는 테이블에 `AccessExclusiveLock`이 걸린 모습이다.
`AccessExclusiveLock`은 가장 강력한 테이블 락(Lock)으로, 해당 테이블의 모든 작업을 차단한다.
빨간색 박스 안에 있는 두 줄을 살펴보면, 하나의 세션에서는 `AccessExclusiveLock`을 획득(`granted = t`)했지만,
다른 세션에서는 획득하지 못한 상태인 것을 확인할 수 있다.
따라서 여러 세션에서 동시에 이 Lock을 획득하려고 시도했기 때문에 교착 상태(Dead Lock)이 발생한거다.
이를 해결하기 위해서 postgres가 실행되고 있는 Docker Container를 재시작했다.
나머지 `RowShareLock`과 `AccessShareLock`에 대해서 간단하게 설명하면 다음과 같다.
- `RowShareLock`: 특정 행에 대한 변경을 방지하지만, 읽기는 허용한다.
- `AccessShareLock`: 다른 트랜잭션이 읽는 것은 가능하지만, 테이블 구조 변경은 금지한다.