본문 바로가기
카테고리 없음

핀테크 서비스 - 동시성 문제

by Lv.1 ysg 2024. 4. 10.

 

 

핀테크 서비스에도 동시성 문제를 해결해야 했다

 

 

데드락

우선 먼저 동시성 테스트를 해보니 락을 사용하지도 않았는데 데드락 에러가 발생했다

데드락

 

 

그래서 찾아보니 레코드를 수정할때 x-lock을 걸어버리고

다른 레코드를 참조하는 새 레코드를 생성할때 s-lock을 건다고 한다

따라서 x-lock을 획득하기 위해 다른 트랜잭션의 s-lock을 기다리게 되버리므로 데드락에 빠진다

 

데드락 히스토리

 

https://0soo.tistory.com/214

 

MySQL 낙관적 락과 데드락(dead lock) With JPA Hibernate

프로젝트에서 모임 가입 기능을 구현하면서, 동시성 문제와 데드락까지 경험한 내용 그리고 어떻게 해결하였는지 고민과정과 해결방법을 정리하려고 합니다. 프로젝트 버전 SpringBoot 2.7.8 MySQL 8.

0soo.tistory.com

 

내 핀테크 서비스에서는 거래 내역을 저장하고 저장되어있는 계좌 정보의 잔액을 수정하므로

거래 내역 저장(insert) 하면서 s-lock을 획득하고 계좌 정보 잔액을 수정(update) 하면서 x-lock을 획득하려고 하는데 다른 트랜잭션에서 s-lock이 걸려 있으므로 데드락에 빠진것이다

 

해결방법

그래서 @lock 어노테이션을 사용해 s-lock이 아닌 처음부터 x-lock을 획득해서 다른 트랜잭션에서 s-lock을 획득하지 못하게 만들어 해결하려고 했다

그러기 위해서 먼저 Repository에 @Lock 어노테이션을 적용한 조회 메소드를 추가했다

 

@Lock 어노테이션을 적용한 조회 메소드 추가

 

 

그리고 트랜잭션이 시작될 때 이를 사용하여 레코드를 조회하도록 했다

findById가 아닌 위에서 추가한 조회 메소드 사용

 

이렇게 하면 @Lock 어노테이션을 적용한 조회 메소드가 실행되기때문에 위에서 말한대로 처음부터 x-Lock을 획득해 해결할수 있었다

 

 

 

 

 

참고링크: https://velog.io/@woodyn1002/my-klas-%EB%82%99%EA%B4%80%EC%A0%81-%EB%9D%BD-vs-%EB%B9%84%EA%B4%80%EC%A0%81-%EB%9D%BD

 

[my-klas] 낙관적 락 vs 비관적 락, 데드락 해결

실험 배경, 낙관적 락, 비관적 락

velog.io

 

https://velog.io/@hsw08/%EB%8F%99%EC%8B%9C%EC%84%B1-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0

 

동시성 문제 해결 과정

동시에 여러 명의 고객이 한 상품을 주문할 때 갱신 손실(Lost Update)/데드락 문제를 해결하는 과정을 담은 내용입니다

velog.io

https://velog.io/@hyojhand/%EC%83%81%ED%92%88-%EC%A3%BC%EB%AC%B8-%EB%8F%99%EC%8B%9C%EC%84%B1-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0%ED%95%98%EA%B8%B0-DeadLock-%EB%82%99%EA%B4%80%EC%A0%81-%EB%9D%BD-%EB%B9%84%EA%B4%80%EC%A0%81-%EB%9D%BD

 

상품 주문 동시성 문제 해결하기 - DeadLock, 낙관적 락(Optimistic Lock) & 비관적 락(Pessimistic Lock)

여러명의 사용자가 동시에 상품의 주문을 요청했을때 발생하는 동시성 문제의 해결과정

velog.io

https://velog.io/@mohai2618/%EB%8F%99%EC%8B%9C%EC%84%B1-%ED%99%98%EA%B2%BD-%ED%85%8C%EC%8A%A4%ED%8A%B8%ED%95%98%EA%B8%B0

 

동시성 환경 테스트하기

멀티쓰레드 환경 구축하여 테스트 하기

velog.io