6.7.2022

Spring Exception-handling bei gekapselte Transactions mit REQUIRED propagation

Wenn in Spring innerhalb einer Transaction mit REQUIRED propagation eine zweite Transaction mit REQUIRED propagation liegt, dort eine Exception geworfen wird und diese erst in der übergeordneten Transaction abgefangen wird, werden "beide" Transactions zurückgerollt.

@RestController
@RequestMapping(Testcontroller.MAPPING)
@RequiredArgsConstructor
@Slf4j
public class Testcontroller {

    public static final String MAPPING = "/api/test";

    private final TestUseCase testusecase;

    @Transactional
    @GetMapping
    @ResponseStatus(HttpStatus.OK)
    public void getTest() {
        try {
            testusecase.test();
        } catch (Exception exception) {
            log.error("Catched ERROR");
        }
    }
}
@Service
@RequiredArgsConstructor
public class TestUseCase {

    private final FieldRepository fieldRepository;

    @Transactional
    public void test() {
        fieldRepository.findById(UUID.fromString("3dc7e0f5-df49-444e-b385-591c591d0b8f")).get().setLastModifiedAt(Instant.now());
        throw new RuntimeException();
    }
}

Aufruf von '/api/test' --> "Internal Server Error org.springframework.transaction.UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-only"

Lösungen für das Problem:

  • Propagation der Transaction auf NESTED setzen
  • Gekapselte Transaction entfernen
  • Exceptionhandling innerhalb der gekapselten Transaction vornehmen
Michael

Softwareentwickler

Zur Übersicht

Standort Hannover

newcubator GmbH
Bödekerstraße 22
30161 Hannover

Standort Dortmund

newcubator GmbH
Westenhellweg 85-89
44137 Dortmund