이슈
사내 회원 서비스 운영중 로그인 과정에서
'트랜잭션이 잠금 리소스에서 다른 프로세스와의 교착 상태가 발생하여 실행이 중지되었습니다. 트랜잭션을 다시 실행하십시오.'
에러와 함께 서버로 들어온 요청이 처리되지 못하고 Error가 발생한 부분을 모니터링을 통해 감지됨.
해당 이슈가 발생한 DataBase는 Ms-SQL 사용중이었으며,
각각 [05:47:300], [05:47:726] 요청시간으로 같은 회원에 의해 동일한 요청이 거의 비슷한 시간에 들어오게 됨
요청 1의 경우 긴 지연시간을 가진후 정상 처리 되었고,
요청 2의 경우 요청 1의 지연시간을 대기하다 위와 같이 DeadLock 처리됨.
원인 및 해결
DeadLock이 발생한 원인을 파악하기 위해 다양한 추론을 통해 접근
1. 로직 처리시간이 느리기 때문이 아닐까?
- 해당 API 자체가 처리시간이 오래 걸리는 것은 확인(내부 분기에 따라 0.3~ 3초이상 소요), 첫번째 3초이상 걸리는 와중에 두번째 요청이 들어와서 처리되지 못하지 않았을까 하였으나, DeadLock이 발생한 시점에 첫번째 요청의 소요시간이 비정상적으로 오래 걸리는 부분을 확인( 8초이상 )
2. 인프라 문제
- DeadLock 발생시 첫번째 요청 처리 시간이 비정상적으로 오래걸리기 때문에, 특정 시점 인프라의 문제로 API 처리 시간이 오래걸리지는 않았을까 하였으나 인프라에는 문제가 없음을 확인
3. 클라이언트에서 동일한 요청을 거의 비슷한 시간에 두번 호출 (원인)
- 두 번의 요청이 '동일한' 고객에 의해 '거의 비슷한' 시간에 호출되었음을 집중
0.n초 이내에 동일한 요청이 두번 들어오게 됨. (클라이언트에서 같은 요청이 0.n초 이내에 호출 되는 케이스 파악 필요)
1번 요청이 RID 락을 잡고 업데이트를 진행하던 도중
2번 요청이 Key 락을 잡고 업데이트를 진행함
1번 요청은 2번 요청의 Key락으로 인해 업데이트 쿼리 진행이 더이상 불가능 하게 되고,
2번 요청은 1번 요청의 RID락으로 인해 업데이트 쿼리 진행이 더이상 불가능하게 됨.
2번 요청이 DeadLock 오류로 락이 해소되면서, 1번 요청은 정상 처리됨
비즈니스 로직상 0.3초만에 두번의 로그인 요청이 있을 수는 없음, 해당 API를 사용하는 팀에 해당 이슈에 대해 문의 및 클라이언트쪽의 로직 오류로 확인하여 동일한 요청을 단시간에 반복호출 하지 않도록 로직 개선
'Database' 카테고리의 다른 글
[Database] 비관적 락(Passimistic Lock)과 낙관적 락(Optimistic Lock) (0) | 2025.02.07 |
---|---|
[Database] 트랜잭션 격리 수준(Isolation Level) (0) | 2024.04.17 |
[Database] 트랜잭션(Transaction)과 ACID 개념 (1) | 2024.04.13 |