codememo

@트랜잭션 주석은 saveAndFlush에서 작동합니까?

tipmemo 2023. 3. 14. 21:39
반응형

@트랜잭션 주석은 saveAndFlush에서 작동합니까?

저는 다음과 같은 구현이 있습니다.

@Transactional
public void saveAndGenerateResult(Data data) {
    saveDataInTableA(data.someAmountForA);
    saveDataInTableB(data.someAmountForB);
    callAnAggregatedFunction(data);
}

public void saveDataInTableA(DataA a) {
    tableARepository.saveAndFlush(a);
}

public void saveDataInTableA(DataB b) {
    tableBRepository.saveAndFlush(b);
}

public void callAnAggregatedFunction() {
    // Do something based on the data saved from the beginning in Table A and Table B
}

사용하는 것이 중요합니다.saveAndFlush데이터를 즉시 사용할 수 있도록 하기 위해callAnAggregatedFunction함수를 사용하여 집계 결과를 가져와 다른 테이블에 저장합니다.그래서 사용하지 않습니다.save내가 아는 바로는 트랜잭션을 데이터베이스로 플러시하지 않는 함수입니다.

단, 사용중인 것은@Transactional함수에 대한 주석saveAndGenerateResult이 함수로 실행한 데이터베이스 트랜잭션을 롤백하고 싶기 때문에 보통 이 함수가 있으면 보증됩니다.@Transactional메서드에 대한 주석.

이 경우의 시나리오는 무엇입니까?사용하고 있다saveAndFlush마지막 기능(예: 마지막 기능)인 경우 데이터를 데이터베이스 테이블로 즉시 플러시합니다.callAnAggregatedFunction)는 데이터를 테이블에 쓸 수 없습니다.테이블 A 및 테이블B의 이전 쓰기 조작은 롤백됩니까?

테이블 A와 테이블 B의 이전 쓰기 작업은 롤백됩니까?

네, 만약 당신이saveAndFlush()메서드는 자체 트랜잭션을 가집니다(즉, 와).propagation = REQUIRES_NEW).

만약 그것들이 모두 당신이 시작한 거래의 일부라면saveAndGenerateResult()데이터베이스 변경은 모두 장애 발생 시 롤백됩니다.

자세한 내용은 봄 - @Transactional - 백그라운드에서 무슨 이 일어나나요?

스프링 @트랜잭션 - 분리, 전파

언급URL : https://stackoverflow.com/questions/49855138/transactional-annotation-works-with-saveandflush

반응형