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
Standort Hannover
newcubator GmbH
Bödekerstraße 22
30161 Hannover
Standort Dortmund
newcubator GmbH
Westenhellweg 85-89
44137 Dortmund