티스토리 뷰
간헐적으로 1건씩 Lock Wait Timeout 발생한 case를 기록한다.
Lock Wait Timeout이란?
Lock 획득을 기다리다가 Lock을 설정된 시간 안에 획득하지 못할 경우 타임아웃이 발생한다. db에서 lock wait timeout 값을 세팅 할 수 있다.
원인
문제가 발생했던 원인은 다음과 같다.
Spring Batch에서 Transaction은 Chunk 단위로 처리하게되는데, 이 로직에 외부 api를 호출하는 case가 있었던 것이다. 평소에 정상적으로 동작하고있었지만, 어느 순간부터 이 api가 간헐적으로 응답이 느려지면서 갑자기 이슈가 생긴것이다. 이 외부 api의 응답이 지연되면 해당 배치에서 최소 chunk size만큼의 데이터 row를 lock으로 잡고있게 되는데, 이 때, 다른쪽(ex] api)에서 해당 row 데이터를 수정하려고 할 때 lock을 획득하지 못하여 Lock Wait Timeout이 발생한것이다.
해결
1. 너무 크게 잡고있던 배치의 chunk size를 적절히 줄인다.
2. 트래픽 증가로 인한 외부 통신간 Network 이슈가 있을수 있으므로 이를 확인하여 latency를 줄인다.
3. 외부 api 처리 flow를 트랜잭션과 분리한다.
댓글