낙관적 락 롤백이 필요할 경우 처리 방법에 대해 질문 드립니다.
891
작성한 질문수 2
낙관적 락을 사용하는 facade에 @Transcation을 붙일 경우 롤백이 되지 않는 문제가 있는데 이럴 때는 어떻게 처리해 주어야 할까요?
예를 들어 List<Strock> stockList를 만들어서 모두 재고를 -100을 하는데 중간에 1개의 Stock이라도 재고가 부족할 경우 Rollback을 할려고 합니다.
이 때 낙관적 락을 사용하면 @Transcation을 사용할 수 없어서 Rollback을 할 수 없는 문제가 있습니다. 이러한 문제를 해결할려면 어떻게 접근하면 좋을까요?
해결방법으로 트랜잭션의 전파를 Required_new를 생각해서 새로운 트랜잭션을 만들어줄려고 하였는데 그렇게 하여도 정상 동작하지 않네요
답변 2
0
@Transcation을 붙여서 롤백기능을 사용할려고 합니다.
예제의 경우 단건의 주문이어서 @Transcation이 필요가 없습니다.
제가 원하는 기능은 여러 Stock을 입력받아서 동시에 주문을 하는 기능입니다.
이때 100개의 Stock을 처리하다가 중간 Stock의 재고가 없을 경우 롤백을 시켜야 하는데 @Transcation을 사용할 수 없어서 롤백을 할 수 없어서 질문드립니다.
제가 오류가 발생한다고 말했던 것은 @Transcation 때문에 원하는 값이 안나온걸 말씀드린것입니다.
0
정상 동작하는 것 확인했습니다. 감사합니다.
추가적인 질문이 있습니다.
StockService의 단건의 경우에 @Transacation을 할 경우 MySQL의 격리레벨이 Repeatable Read여서 version이 상승되지 않는 문제가 있는 것으로 알고 있습니다.
이 경우에는 왜 정상 동작하는지 궁금합니다.
0
현재 궁금한 것은 @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 에 올리신 후에 주소를 공유해주실 수 있으실까요 ?
공유해주시면 문제를 파악하고 방법을 찾는데 도움이 될 것 같습니다.
레디선 테스트코드에서 채널이름은 없어도 되는건가요?
0
48
2
낙관적 락을 사용할 떄 차이점
0
128
2
동시성 검증 코드에 관한 문의
0
97
2
단일연산
0
72
2
낙관적락vs. 레디스락
0
111
2
안녕하세요. 레디슨 질문있습니다..!!
0
67
2
@Lock(OPTIMISTIC)이 필요한 이유
0
91
2
get_lock 의 timeout이 3000초 이던데 너무 긴거 아닌가요?
0
132
2
DataSource Hikari 사용 이유
0
149
2
saveAndFlush 사용 이유 문의
0
115
3
비관적 락 VS 네임드 락
0
161
3
application.yaml 에 redis 정보
0
101
2
왜 클래스 이름에 Facade 가 붙나요?
0
185
2
@Transactional 으로 인한 동시성 문제 발생 원인이 궁금합니다.
0
220
2
@modifying 이용한 동시성 제어
0
169
2
DB락과 분산락
0
263
2
NamedLock 테스트 실패
0
186
2
테스트에서 트랜잭션 어노테이션 질문 있습니다.
0
174
2
optimistic Lock 재시도 질문입니다.
0
233
2
낙관적 락 테스트 실패
0
243
2
오류?
0
1632
4
LettureLockStockFacadeTest에서 오류가 발생합니다.
1
268
2
Pessimistic Lock 전체 테스트 오류 문의
0
363
3
비관적 락 vs 레디스(Lettuce)락 비교 관련 질문
0
462
2





