본문 바로가기
이슈 기록

[DB] 배치 실행 시 DB 쪽 데드락 발생 이슈 해결

by 대우니 2024. 11. 1.
728x90
반응형

목적

우선 배치는 아이디를 기준으로 파티셔너에 의해 5분할 되어 워커 노드 5개로 분리되어 실행되었으며, 데드락을 방지하고자 파티션 별로 테이블이 나누어져있었다.

그러나 배치 실행 시 데드락 발생으로 지속적으로 이슈가 발생하고 있어 이슈를 기록하고, 해결한 부분을 기록하고자 작성한다.

이슈

배치 실행 시 insert 작업할 때 데드락이 발생했다.

INSERT INTO table () values (?,?..)
....
Deadlock found when trying to get lock; try restarting transaction; nested exception is java.sql.BatchUpdateException: Deadlock found when trying to get lock;

새벽 5시에 발생하는 문제 원인

해당 배치는 아이디를 기준으로 파티셔너에 의해 5분할 되어 워커 노드 5개로 분리되어 실행된다.

참고로 해당 배치는 테이블과 다른 데이터가 거의 없으며 프로세스가 동일한 시간으로 진행되고 따라서 inno DB(버퍼풀) 쪽에서 경합이 발생했다.

버퍼풀을 얻기 위한 경쟁이 발생하면서 지연이 발생하고, insert 수행 시, 커밋이 늦어지게 됨. 커밋이 되어야 트랜잭션이 종료되고, lock이 회수 되는 것인데, 늦어졌다.

그러면서 데드락이 발생함. 버퍼풀 자원의 경쟁으로 lock을 회수하는 기간이 길어지면서..

 

오후 시간에는 발생하지 않는 이유

오후 실행 시 변경된 데이터가 만개 정도 존재하면서 트랜잭션끼리 동시에 버퍼풀 경합이 발생할 확률이 낮아서 데드락도 발생하지 않게 됨.

해결 방안 1

파티션마다 지연 시간을 다르게 부여함으로써 버퍼풀 경합이 발생하지 않도록 수행해보고자 함. 
→ 지속적인 데드락 발생함. 따라서 근본적인 해결이 되지 않음

해결 방안 2

delete 테이블을 가장 마지막으로 수행하고, 조인할 때 타겟 범위 설정하도록 수정
→ 빈번한 delete 작업으로 인해 버퍼풀에 더티페이지가 발생하면서 다른 Insert 작업을 수행하기 위해 버퍼풀이 충분하지 않아 데드락이 발생한 것으로 추정된다.

반응형