quarkusio/quarkus · error · IllegalArgumentException

Spring @Transactional with propagation NESTED is not support

Error message

Spring @Transactional with propagation NESTED is not supported by Quarkus. Offending location: <target>

What it means

SpringTransactionalProcessor.validateTransactionalAnnotations fails the build at deployment time when a Spring @Transactional annotation declares propagation = NESTED, which Quarkus/Narayana's Spring-compatible layer does not implement. The message names the offending location via SpringTransactionalUtil.describeTarget.

Source

Thrown at extensions/spring-tx/deployment/src/main/java/io/quarkus/spring/tx/deployment/SpringTransactionalProcessor.java:40

    @BuildStep
    FeatureBuildItem feature() {
        return new FeatureBuildItem(Feature.SPRING_TX);
    }

    @BuildStep
    AnnotationsTransformerBuildItem transform() {
        return new AnnotationsTransformerBuildItem(new SpringTransactionalAnnotationsTransformer());
    }

    @BuildStep
    @Produce(ServiceStartBuildItem.class)
    void validateTransactionalAnnotations(CombinedIndexBuildItem combinedIndex) {
        Collection<AnnotationInstance> instances = combinedIndex.getIndex()
                .getAnnotations(SPRING_TRANSACTIONAL);
        for (AnnotationInstance instance : instances) {
            AnnotationValue propagationValue = instance.value("propagation");
            if (propagationValue != null && "NESTED".equals(propagationValue.asEnum())) {
                throw new IllegalArgumentException(
                        "Spring @Transactional with propagation NESTED is not supported by Quarkus. "
                                + "Offending location: "
                                + SpringTransactionalUtil.describeTarget(instance.target()));
            }
        }
    }
}

View on GitHub (pinned to e1c734241f)

Solutions

  1. Replace Propagation.NESTED with Propagation.REQUIRED (or another supported value such as REQUIRES_NEW)
  2. Refactor the method so partial rollback is handled with explicit exception handling inside a single transaction
  3. Remove the propagation attribute entirely to use the default REQUIRED behavior
  4. If savepoint semantics are essential, use jakarta.transaction APIs / transactional semantics Quarkus supports

Example fix

// before
@Transactional(propagation = Propagation.NESTED)
public void doWork() {...}
// after
@Transactional(propagation = Propagation.REQUIRED)
public void doWork() {...}
Defensive patterns

Strategy: validation

Validate before calling

// search the codebase before building:
// grep -r 'Propagation.NESTED' src/  -> must return nothing when using quarkus-spring-tx

Prevention

When it happens

Trigger: Using org.springframework.transaction.annotation.Transactional(propagation = Propagation.NESTED) on a bean method/class in a Quarkus application that includes the quarkus-spring-tx extension.

Common situations: Porting a Spring Boot app to Quarkus that relied on JDBC savepoints for partial rollback; copy-pasting Spring configuration including NESTED propagation; Spring migration guides recommending NESTED for nested transactions.

Related errors


AI-assisted analysis of quarkusio/quarkus@e1c734241f (2026-09-05). Data as JSON: /api/errors/3e506aecb5d13c3a. Report an issue: GitHub.