programing

봄 트랜잭션 필수 대 REQUESTERS_NEW : 롤백 트랜잭션

goodsources 2023. 8. 29. 20:30
반응형

봄 트랜잭션 필수 대 REQUESTERS_NEW : 롤백 트랜잭션

나는 다음과 같은 방법을 가지고 있습니다.propagation = Propagation.REQUIRES_NEW트랜잭션 속성:

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void createUser(final UserBean userBean) {
    //Some logic here that requires modification in DB
}

이 메서드는 모든 트랜잭션에 대해 동시에 여러 번 호출할 수 있으며, 오류가 발생할 경우 롤백되지 않습니다(다른 트랜잭션과는 별도로).

문제는 이로 인해 Spring이 다른 트랜잭션을 사용할 수 있더라도 여러 개의 트랜잭션을 생성하게 되고 일부 성능 문제가 발생할 수 있다는 것입니다.


자바 문서propagation = Propagation.REQUIRED다음과 같이 말합니다.Support a current transaction, create a new one if none exists.

이것으로 성능 문제가 해결되는 것 같지 않습니까?

롤백 문제는 어떻습니까?기존 트랜잭션을 사용하는 동안 새로운 메서드 호출이 롤백되면 어떻게 됩니까? 그러면 이전의 호출도 전체 트랜잭션을 롤백하지 않습니까?

[편집] 제 질문이 충분히 명확하지 않았던 것 같습니다.

수백 개의 클라이언트가 서버에 연결되어 있습니다.

각 클라이언트에 대해 트랜잭션에 대한 피드백을 보낼 필요가 있습니다(확인 또는 예외 -> 롤백).

제 질문은 다음과 같습니다.REQUIRED하나의 트랜잭션만 사용되며, 100번째 클라이언트에서 문제가 발생하면 첫 번째 클라이언트의 트랜잭션도 롤백됩니까?

사용.REQUIRES_NEW메소드가 트랜잭션 컨텍스트에서 호출될 때만 관련이 있습니다. 메소드가 비전통적 컨텍스트에서 호출될 때와 동일하게 동작합니다.REQUIRED새 트랜잭션이 생성됩니다.

그렇다고 해서 모든 클라이언트에 대해 단일 트랜잭션만 있는 것은 아닙니다. 각 클라이언트는 트랜잭션이 아닌 컨텍스트에서 시작하고 요청 처리가 완료되는 즉시@Transactional새 트랜잭션이 생성됩니다.

그래서, 그것을 염두에 두고, 만약 사용한다면.REQUIRES_NEW성능에 대해 걱정하지 않는 것보다 해당 작업의 의미에 대해 이해할 수 있습니다. 이것은 조기 최적화를 교과서적으로 보여주는 것입니다. 저는 성능 메트릭이 수집된 후에는 정확성과 데이터 무결성을 강조하고 성능에 대해 걱정하고 싶습니다.

롤백 시 - 사용REQUIRES_NEW그러면 새 트랜잭션이 강제로 시작되므로 예외가 해당 트랜잭션을 롤백합니다.실행 중인 다른 트랜잭션도 있는 경우(예외가 스택에 거품을 일으키는지 탐지되었는지에 따라 롤백되지 않는지 여부) 작업의 세부 사항에 따라 선택할 수 있습니다.또한 트랜잭션 전략 및 롤백에 대한 보다 심층적인 논의를 위해 다음을 추천합니다. »트랜잭션 전략: 거래의 함정에 대한 이해», Mark Richards.

별도의 트랜잭션에서 수행해야 하는 경우 사용해야 합니다.REQUIRES_NEW성능 오버헤드를 감수해야 합니다.고정 잠금 장치를 주의하십시오.

반대로 하는 게 낫겠어요.

  • Java 측에서 데이터를 확인합니다.
  • 모든 작업을 한 번의 트랜잭션으로 실행합니다.
  • DB측에서 잘못된 부분이 있다면 -> DB 또는 Validation design의 큰 오류입니다.모든 항목을 롤백하고 심각한 최상위 오류를 발생시킵니다.
  • 좋은 단위 테스트를 작성합니다.

언급URL : https://stackoverflow.com/questions/13051204/spring-transaction-required-vs-requires-new-rollback-transaction

반응형