복붙노트

[SPRING] 낙관적 잠금을위한 재시도 메커니즘 (스프링 데이터 + JPA)

SPRING

낙관적 잠금을위한 재시도 메커니즘 (스프링 데이터 + JPA)

동시성을 높이고 비관적 인 잠금을 사용하지 않고 웹 애플리케이션에서 낙관적 인 잠금을 사용하기로 결정했습니다.

우리는 이제 재시도 솔루션을 고려하고 있습니다.

우리는 현재 코드베이스에 가능한 한 적은 영향을주고 싶습니다.

웹에서 보았던 솔루션 중 하나는 재시도 기능을 재시도 가능으로 표시하기 위해 주석이있는 재시도 인터셉터를 사용하는 것입니다.

문제는 @Transactional 어노테이션이있는 메소드에 주석을 달고 싶지만 인터셉터가 어떤 이유로 든 다시 시도하지 못하는 것입니다. (인터셉터는 비 트랜잭션 방식을 완벽하게 재 시도합니다.)

그래서:

1) 우리의 코드에 최소한의 영향을 미칠 재 시도를위한 대안이 있습니까?

2) 해당 솔루션에 대한 문서화 \ 자습서가 있습니까?

3) @Transactional 주석 메서드를 다시 시도 할 수 있습니까?

건배!

해결법

  1. ==============================

    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. ==============================

    2.다음과 같이이를 달성하는 두 가지 방법이 있습니다.

    다음과 같이이를 달성하는 두 가지 방법이 있습니다.

    최대 절전 모드의 낙관적 인 잠금 예외로부터 복구하기

    또는

    Spring AOP를 사용하여 멱등 열 동시 작업 재 시도

    이게 너를 도울 수 있기를 바란다 ..!

  3. from https://stackoverflow.com/questions/21672428/retry-mechanism-for-optimistic-locking-spring-data-jpa by cc-by-sa and MIT license