작성
·
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 때문에 원하는 값이 안나온걸 말씀드린것입니다.
정상 동작하는 것 확인했습니다. 감사합니다.
추가적인 질문이 있습니다.
StockService의 단건의 경우에 @Transacation을 할 경우 MySQL의 격리레벨이 Repeatable Read여서 version이 상승되지 않는 문제가 있는 것으로 알고 있습니다.
이 경우에는 왜 정상 동작하는지 궁금합니다.
현재 궁금한 것은 @Transactio과 관련된 내용입니다.
강의에서 decrease하는 메서드에 @Transaction을 붙이지 않습니다. 그런데 @Transacation을 붙이게 될 경우 무한루프가 돌게 됩니다.
이 글을 참고하여서 @Transactio을 붙일 경우 MySQL의 격리레벨이 Repeatable Read여서 같은 트랜잭션에서 read 할때마다 같은 version이 읽히기 때문이라고 이해했습니다.
그런데 위처럼 List형식으로 받아서 처리하는 메서드 위의 @Transaction을 붙일 경우에는 정상동작을 하게됩니다.
이 부분이 이해가 가지 않아서 질문드립니다. 위 사진을 예로 들면 List를 받는 order(사진의 아래 메서드)에 @Transaction을 붙이게 되면 내부에서 호출된 order 메서드또한 같은 트랜잭션에서 실행이 되는데 낙관적 락이 정상적으로 실행이 되기 때문입니다.
제 생각에 repeatable read여서 한 트랜잭션 안에서 결국 실행이 때기 되문에 version의 값이 변경되지 않아야 하고, 그러면 동시성 처리가 정상적으로 되지 않아야합니다.
하지만 제 생각과 다르게 코드에서 아래쪽 메서드에 @Transcation을 붙일 경우에는 정상적으로 동작합니다. 그래서 단건일때 @Transacation을 붙이게 되면 이때도 정상동작하는지 테스트를 해보았는데 이때는 정상동작하지 않았습니다.
이러는 이유를 알 수 있을까요?
0
woong choi 님 안녕하세요.
일단 예제에서는 facade 에 @Transaction 을 붙이지 않는데 붙이시려는 이유가 궁금합니다.
두번째로 오류가 발생하는 소스를 github 에 올리신 후에 주소를 공유해주실 수 있으실까요 ?
공유해주시면 문제를 파악하고 방법을 찾는데 도움이 될 것 같습니다.
Facade class 에 @Transaction 을 붙이는게 아닌 StockService 에 @Transactional 을 붙이면 정상 동작할 듯합니다.