핀테크 서비스에도 동시성 문제를 해결해야 했다
데드락
우선 먼저 동시성 테스트를 해보니 락을 사용하지도 않았는데 데드락 에러가 발생했다
그래서 찾아보니 레코드를 수정할때 x-lock을 걸어버리고
다른 레코드를 참조하는 새 레코드를 생성할때 s-lock을 건다고 한다
따라서 x-lock을 획득하기 위해 다른 트랜잭션의 s-lock을 기다리게 되버리므로 데드락에 빠진다
내 핀테크 서비스에서는 거래 내역을 저장하고 저장되어있는 계좌 정보의 잔액을 수정하므로
거래 내역 저장(insert) 하면서 s-lock을 획득하고 계좌 정보 잔액을 수정(update) 하면서 x-lock을 획득하려고 하는데 다른 트랜잭션에서 s-lock이 걸려 있으므로 데드락에 빠진것이다
해결방법
그래서 @lock 어노테이션을 사용해 s-lock이 아닌 처음부터 x-lock을 획득해서 다른 트랜잭션에서 s-lock을 획득하지 못하게 만들어 해결하려고 했다
그러기 위해서 먼저 Repository에 @Lock 어노테이션을 적용한 조회 메소드를 추가했다
그리고 트랜잭션이 시작될 때 이를 사용하여 레코드를 조회하도록 했다
이렇게 하면 @Lock 어노테이션을 적용한 조회 메소드가 실행되기때문에 위에서 말한대로 처음부터 x-Lock을 획득해 해결할수 있었다
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