인프런 커뮤니티 질문&답변

woong choi님의 프로필 이미지
woong choi

작성한 질문수

재고시스템으로 알아보는 동시성이슈 해결방법

Optimistic Lock 활용해보기

낙관적 락 롤백이 필요할 경우 처리 방법에 대해 질문 드립니다.

작성

·

766

0

낙관적 락을 사용하는 facade에 @Transcation을 붙일 경우 롤백이 되지 않는 문제가 있는데 이럴 때는 어떻게 처리해 주어야 할까요?

예를 들어 List<Strock> stockList를 만들어서 모두 재고를 -100을 하는데 중간에 1개의 Stock이라도 재고가 부족할 경우 Rollback을 할려고 합니다.

이 때 낙관적 락을 사용하면 @Transcation을 사용할 수 없어서 Rollback을 할 수 없는 문제가 있습니다. 이러한 문제를 해결할려면 어떻게 접근하면 좋을까요?

해결방법으로 트랜잭션의 전파를 Required_new를 생각해서 새로운 트랜잭션을 만들어줄려고 하였는데 그렇게 하여도 정상 동작하지 않네요

답변 2

0

@Transcation을 붙여서 롤백기능을 사용할려고 합니다.

예제의 경우 단건의 주문이어서 @Transcation이 필요가 없습니다.

제가 원하는 기능은 여러 Stock을 입력받아서 동시에 주문을 하는 기능입니다.

이때 100개의 Stock을 처리하다가 중간 Stock의 재고가 없을 경우 롤백을 시켜야 하는데 @Transcation을 사용할 수 없어서 롤백을 할 수 없어서 질문드립니다.

 

제가 오류가 발생한다고 말했던 것은 @Transcation 때문에 원하는 값이 안나온걸 말씀드린것입니다.

최상용님의 프로필 이미지
최상용
지식공유자

Facade class 에 @Transaction 을 붙이는게 아닌 StockService 에 @Transactional 을 붙이면 정상 동작할 듯합니다.

woong choi님의 프로필 이미지
woong choi
질문자

정상 동작하는 것 확인했습니다. 감사합니다.

추가적인 질문이 있습니다.

StockService의 단건의 경우에 @Transacation을 할 경우 MySQL의 격리레벨이 Repeatable Read여서 version이 상승되지 않는 문제가 있는 것으로 알고 있습니다.

이 경우에는 왜 정상 동작하는지 궁금합니다.

최상용님의 프로필 이미지
최상용
지식공유자

woong choi 님 안녕하세요.

상황을 조금만 더 자세하게 설명해주실 수 있으실까요 ?

woong choi님의 프로필 이미지
woong choi
질문자

현재 궁금한 것은 @Transactio과 관련된 내용입니다.

강의에서 decrease하는 메서드에 @Transaction을 붙이지 않습니다. 그런데 @Transacation을 붙이게 될 경우 무한루프가 돌게 됩니다.

https://www.inflearn.com/course/%EB%8F%99%EC%8B%9C%EC%84%B1%EC%9D%B4%EC%8A%88-%EC%9E%AC%EA%B3%A0%EC%8B%9C%EC%8A%A4%ED%85%9C/unit/114979?tab=community&category=questionDetail&q=689294

이 글을 참고하여서 @Transactio을 붙일 경우 MySQL의 격리레벨이 Repeatable Read여서 같은 트랜잭션에서 read 할때마다 같은 version이 읽히기 때문이라고 이해했습니다.

image

그런데 위처럼 List형식으로 받아서 처리하는 메서드 위의 @Transaction을 붙일 경우에는 정상동작을 하게됩니다.

이 부분이 이해가 가지 않아서 질문드립니다. 위 사진을 예로 들면 List를 받는 order(사진의 아래 메서드)에 @Transaction을 붙이게 되면 내부에서 호출된 order 메서드또한 같은 트랜잭션에서 실행이 되는데 낙관적 락이 정상적으로 실행이 되기 때문입니다.

제 생각에 repeatable read여서 한 트랜잭션 안에서 결국 실행이 때기 되문에 version의 값이 변경되지 않아야 하고, 그러면 동시성 처리가 정상적으로 되지 않아야합니다.

하지만 제 생각과 다르게 코드에서 아래쪽 메서드에 @Transcation을 붙일 경우에는 정상적으로 동작합니다. 그래서 단건일때 @Transacation을 붙이게 되면 이때도 정상동작하는지 테스트를 해보았는데 이때는 정상동작하지 않았습니다.

이러는 이유를 알 수 있을까요?

최상용님의 프로필 이미지
최상용
지식공유자

woong choi 님 안녕하세요.

전체적인 소스를 보면서 이야기를 해보면 좋을것 같은데 혹시 github 을 통해 소스를 공유해주실 수 있으실까요 ?

0

최상용님의 프로필 이미지
최상용
지식공유자

woong choi 님 안녕하세요.

일단 예제에서는 facade 에 @Transaction 을 붙이지 않는데 붙이시려는 이유가 궁금합니다.

두번째로 오류가 발생하는 소스를 github 에 올리신 후에 주소를 공유해주실 수 있으실까요 ?

공유해주시면 문제를 파악하고 방법을 찾는데 도움이 될 것 같습니다.

 

woong choi님의 프로필 이미지
woong choi

작성한 질문수

질문하기