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
Zur Übersicht

Mehr vom DevSquad...

Dennis Hundertmark

Angular 14 Typed Forms

Sophia Brandt

Unblah.me - Wenn man in Meetings zu viel spricht