import dev.caskeleton.adapter.outbound.persistence.api.PersistenceOperationName; import dev.caskeleton.adapter.outbound.persistence.api.error.JpaPersistenceException; import dev.caskeleton.adapter.outbound.persistence.api.transaction.TransactionProfile; import dev.caskeleton.adapter.outbound.persistence.api.error.ConstraintCode; import dev.caskeleton.adapter.outbound.persistence.postgresql.error.PostgreSqlExceptionTranslator; import dev.caskeleton.adapter.outbound.persistence.transaction.OptimisticConflictTranslator; import dev.caskeleton.adapter.outbound.persistence.transaction.PersistenceFailureTranslatorChain; import dev.caskeleton.adapter.outbound.persistence.transaction.SpringJpaTransactionExecutor; import java.sql.SQLException; import java.time.*; import org.springframework.transaction.*; import org.springframework.transaction.support.SimpleTransactionStatus; public class JpaCommitAmbiguityProbe { public static void main(String[] args) { PlatformTransactionManager tm = new PlatformTransactionManager() { public TransactionStatus getTransaction(TransactionDefinition d) { return new SimpleTransactionStatus(true); } public void commit(TransactionStatus s) { throw new TransactionSystemException("commit acknowledgement lost", new SQLException("connection lost", "08006")); } public void rollback(TransactionStatus s) {} }; var translator = PostgreSqlExceptionTranslator.with(name -> new ConstraintCode("unknown.constraint")); var executor = new SpringJpaTransactionExecutor( tm, Clock.fixed(Instant.parse("2026-08-29T00:00:00Z"), ZoneOffset.UTC), new PersistenceFailureTranslatorChain(OptimisticConflictTranslator.withoutCatalog(), translator)); try { executor.execute( new PersistenceOperationName("probe.commit"), TransactionProfile.write("probe.commit", Duration.ofSeconds(5)), () -> "written", 1, "reconcile-key-1"); } catch (JpaPersistenceException ex) { System.out.println("type=" + ex.getClass().getSimpleName()); System.out.println("category=" + ex.category()); System.out.println("completionUnknown=" + ex.completionUnknown()); System.out.println("retryable=" + ex.retryable()); } } }