[SPRING] 낙관적 잠금을위한 재시도 메커니즘 (스프링 데이터 + JPA)
SPRING낙관적 잠금을위한 재시도 메커니즘 (스프링 데이터 + JPA)
동시성을 높이고 비관적 인 잠금을 사용하지 않고 웹 애플리케이션에서 낙관적 인 잠금을 사용하기로 결정했습니다.
우리는 이제 재시도 솔루션을 고려하고 있습니다.
우리는 현재 코드베이스에 가능한 한 적은 영향을주고 싶습니다.
웹에서 보았던 솔루션 중 하나는 재시도 기능을 재시도 가능으로 표시하기 위해 주석이있는 재시도 인터셉터를 사용하는 것입니다.
문제는 @Transactional 어노테이션이있는 메소드에 주석을 달고 싶지만 인터셉터가 어떤 이유로 든 다시 시도하지 못하는 것입니다. (인터셉터는 비 트랜잭션 방식을 완벽하게 재 시도합니다.)
그래서:
1) 우리의 코드에 최소한의 영향을 미칠 재 시도를위한 대안이 있습니까?
2) 해당 솔루션에 대한 문서화 \ 자습서가 있습니까?
3) @Transactional 주석 메서드를 다시 시도 할 수 있습니까?
건배!
해결법
-
==============================
1.버전 번호 또는 타임 스탬프 검사가 실패한 경우 (낙관적 잠금이 발생하는 경우) Spring 재시도를 사용하여 트랜잭션 방식을 다시 시도 할 수 있습니다.
버전 번호 또는 타임 스탬프 검사가 실패한 경우 (낙관적 잠금이 발생하는 경우) Spring 재시도를 사용하여 트랜잭션 방식을 다시 시도 할 수 있습니다.
@Configuration @EnableRetry public class RetryConfig { }
@Retryable(StaleStateException.class) @Transactional public void doSomethingWithFoo(Long fooId){ // read your entity again before changes! Foo foo = fooRepository.findOne(fooId); foo.setStatus(REJECTED) // <- sample foo modification } // commit on method end
@Transational (propagation = REQUIRES_NEW)를 사용하여 주석이 달린 메소드의 코드 만 다시 시도하십시오.
-
==============================
2.다음과 같이이를 달성하는 두 가지 방법이 있습니다.
다음과 같이이를 달성하는 두 가지 방법이 있습니다.
최대 절전 모드의 낙관적 인 잠금 예외로부터 복구하기
또는
Spring AOP를 사용하여 멱등 열 동시 작업 재 시도
이게 너를 도울 수 있기를 바란다 ..!
from https://stackoverflow.com/questions/21672428/retry-mechanism-for-optimistic-locking-spring-data-jpa by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 최대 절전 모드 1 캐시를 사용하거나 수동 세션 플러시를 수행하지 않고 Spring @ Transaction을 어떻게 테스트합니까? (0) | 2019.04.20 |
---|---|
[SPRING] Maven - 목표 org.apache.maven.plugins : maven-clean-plugin : 2.4.1 : clean을 실행하지 못했습니다. (0) | 2019.04.20 |
[SPRING] 스프링 보안을 구성하는 방법을 제공합니까? (0) | 2019.04.20 |
[SPRING] Spring JDBC + Postgres SQL + Java 8 - LocalDate에서 /로 변환 (0) | 2019.04.20 |
[SPRING] Spring 빈에 파일 자원 주입 (0) | 2019.04.20 |