- Bug227307Atomikos JTA timeout not immediately interrupting ongoing transactions
- Bug228434Timed-out coordinator resets an enlisted resource's timeout to the backend default
- Feature226870Skip the legacy Oracle AQ forceConnectionIntoXaMode workaround (opt-in feature flag)
- SBOM — runtime dependencies are minimalistic
forceConnectionIntoXaMode workaround on spec-compliant JMS
providers and on Oracle AQ 19c and later.
Bug227307 Atomikos JTA timeout not immediately interrupting ongoing transactions
Description
Atomikos now refuses to enlist a resource on a transaction that has already timed out or been marked rollback-only, interrupting a doomed transaction early rather than letting it proceed and fail later at commit. This behaviour is opt-in and off by default.
Technical details
Enable it by addingcom.atomikos.icatch.feature.227307=true to your
jta.properties (off by default in this release for backward compatibility).
With the flag on, the refusal happens before XA START, so no XA branch is
ever started: the doomed transaction rolls back through the normal path and the
borrowed pooled connection or JMS session returns to the pool via the managed
lifecycle (no leak). On the JDBC side the refusal surfaces to your code as an
AtomikosSQLException (a normal SQLException); on the JMS side as a
JMSException. The check is a cheap timeout/state test done before XA START —
for a doomed transaction it actually saves the wasted round-trip to the backend.
Because a flow that previously relied on the late (commit-time) failure will now
fail fast at enlistment, we ship it off by default; enable it in a test
environment first, then roll it out more broadly.
Changes impacting client API
None. The behaviour is opt-in via a feature flag and off by default.
Bug228434 Timed-out coordinator resets an enlisted resource's timeout to the backend default
Description
An already-timed-out coordinator no longer resets an enlisted resource's own transaction timeout to the backend default. This means a resource enlisted on an expired transaction is no longer held longer than necessary.
Technical details
When a transaction had already timed out (getTimeout() < 0=),
XAResourceTransaction computed the remaining time and passed it to
XAResource.setTransactionTimeout. Per the JTA/XA contract,
setTransactionTimeout(0) means "reset to the default timeout", so the backend
did not learn that the transaction had expired and reset its own timeout to the
default — holding XA resources unnecessarily long. Atomikos now avoids passing a
zero-or-negative value, so it no longer resets the resource timeout when the
coordinator has already timed out. (Surfaced alongside the doomed-enlistment
guard, also in this release.)
Changes impacting client API
None.
Feature226870 Skip the legacy Oracle AQ forceConnectionIntoXaMode workaround (opt-in feature flag)
Description
You can now skip the legacy Oracle AQforceConnectionIntoXaMode workaround,
avoiding wasteful per-session churn on spec-compliant JMS providers and on
Oracle AQ 19c and later.
Technical details
The workaround opens a transacted JMS session and rolls it back before everycreateXASession() call, purely to coax older Oracle AQ into XA mode; for
spec-compliant JMS providers (and Oracle AQ 19c+) this is unnecessary churn.
Control it with com.atomikos.icatch.feature.226870 in jta.properties. The
flag has inverted semantics: true keeps the legacy workaround (required for
pre-19c Oracle AQ), false skips it. In this release the default is true
(workaround preserved) for backward compatibility; set it to false if you run
on Oracle AQ 19c+ or a spec-compliant JMS provider.
Changes impacting client API
None. Behaviour is controlled by an opt-in feature flag; the default preserves the previous behaviour.
SBOM — runtime dependencies are minimalistic
Concerning security and vulnerabilities: the following are the runtime dependencies (the SBOM) of our product. As you can see, the only transitive third-party dependencies are for the Spring Boot integration modules — because that is the only way to integrate with Spring Boot. All other modules / jars have no third-party runtime dependencies whatsoever.
This is compile + runtime scope;provided, test and non-propagating
optional dependencies are excluded, so it is what your application
actually receives. Look up the module(s) your application depends on.
To reproduce it yourself, run this in a project that depends on the
Atomikos artifacts you use (use exactly this — not a bare dependency:tree,
which would also list optional/provided libraries you are not given):
mvn dependency:list -DincludeScope=runtime
Modules with no third-party runtime dependencies
transactions transactions-api transactions-eclipselink transactions-hibernate2 subscription transactions-hibernate3 transactions-hibernate4 transactions-jdbc transactions-jms transactions-jndi-provider transactions-jta transactions-osgi transactions-remoting atomikos-util transactions-allegrograph transactions-hazelcast transactions-jmx transactions-jsp transactions-logcloud transactions-logutil transactions-micrometer transactions-monitoring transactions-monitoring-logs transactions-monitoring-stderr transactions-opentracing transactions-osgi-axt transactions-remoting-recovery transactions-spring transactions-spring-boot-logcloud transactions-tomcat
Per-module third-party runtime dependencies (opt-in, customer-chosen)
The dependencies below appear ONLY if you choose to use the corresponding integration module. They are the platform your application already runs — you added, say, the Spring Boot starter because you use Spring Boot. These are your own, customer-chosen dependencies: Atomikos does not inject anything into your infrastructure; you opt in by depending on the module.transactions-spring-boot org.springframework.boot:spring-boot:2.3.4.RELEASE org.springframework:spring-aop:5.2.9.RELEASE org.springframework:spring-beans:5.2.9.RELEASE org.springframework:spring-context:5.2.9.RELEASE org.springframework:spring-core:5.2.9.RELEASE org.springframework:spring-expression:5.2.9.RELEASE org.springframework:spring-jcl:5.2.9.RELEASE org.springframework:spring-tx:5.2.9.RELEASE transactions-spring-boot-starter org.springframework.boot:spring-boot:2.3.4.RELEASE org.springframework:spring-aop:5.2.9.RELEASE org.springframework:spring-beans:5.2.9.RELEASE org.springframework:spring-context:5.2.9.RELEASE org.springframework:spring-core:5.2.9.RELEASE org.springframework:spring-expression:5.2.9.RELEASE org.springframework:spring-jcl:5.2.9.RELEASE org.springframework:spring-tx:5.2.9.RELEASE transactions-spring-boot3 jakarta.jms:jakarta.jms-api:3.1.0 jakarta.transaction:jakarta.transaction-api:2.0.1 org.springframework.boot:spring-boot:3.0.1 org.springframework:spring-aop:6.0.3 org.springframework:spring-beans:6.0.3 org.springframework:spring-context:6.0.3 org.springframework:spring-core:6.0.3 org.springframework:spring-expression:6.0.3 org.springframework:spring-jcl:6.0.3 org.springframework:spring-tx:6.0.3 transactions-spring-boot3-starter jakarta.jms:jakarta.jms-api:3.1.0 jakarta.transaction:jakarta.transaction-api:2.0.1 org.springframework.boot:spring-boot:3.0.1 org.springframework:spring-aop:6.0.3 org.springframework:spring-beans:6.0.3 org.springframework:spring-context:6.0.3 org.springframework:spring-core:6.0.3 org.springframework:spring-expression:6.0.3 org.springframework:spring-jcl:6.0.3 org.springframework:spring-tx:6.0.3 transactions-spring-boot3.4 io.micrometer:micrometer-commons:1.12.0 io.micrometer:micrometer-observation:1.12.0 jakarta.jms:jakarta.jms-api:3.1.0 jakarta.transaction:jakarta.transaction-api:2.0.1 org.springframework.boot:spring-boot:3.2.0 org.springframework:spring-aop:6.1.1 org.springframework:spring-beans:6.1.1 org.springframework:spring-context:6.1.1 org.springframework:spring-core:6.1.1 org.springframework:spring-expression:6.1.1 org.springframework:spring-jcl:6.1.1 org.springframework:spring-tx:6.1.1 transactions-spring-boot3.4-starter io.micrometer:micrometer-commons:1.12.0 io.micrometer:micrometer-observation:1.12.0 jakarta.jms:jakarta.jms-api:3.1.0 jakarta.transaction:jakarta.transaction-api:2.0.1 org.springframework.boot:spring-boot:3.2.0 org.springframework:spring-aop:6.1.1 org.springframework:spring-beans:6.1.1 org.springframework:spring-context:6.1.1 org.springframework:spring-core:6.1.1 org.springframework:spring-expression:6.1.1 org.springframework:spring-jcl:6.1.1 org.springframework:spring-tx:6.1.1 transactions-spring-boot4 ch.qos.logback:logback-classic:1.5.21 ch.qos.logback:logback-core:1.5.21 com.zaxxer:HikariCP:7.0.2 commons-logging:commons-logging:1.3.5 io.micrometer:micrometer-commons:1.16.0 io.micrometer:micrometer-observation:1.16.0 jakarta.annotation:jakarta.annotation-api:3.0.0 jakarta.jms:jakarta.jms-api:3.1.0 jakarta.transaction:jakarta.transaction-api:2.0.1 org.apache.logging.log4j:log4j-api:2.25.2 org.apache.logging.log4j:log4j-to-slf4j:2.25.2 org.jspecify:jspecify:1.0.0 org.slf4j:jul-to-slf4j:2.0.17 org.slf4j:slf4j-api:2.0.17 org.springframework.boot:spring-boot-autoconfigure:4.0.0 org.springframework.boot:spring-boot-data-commons:4.0.0 org.springframework.boot:spring-boot-data-jdbc:4.0.0 org.springframework.boot:spring-boot-jdbc:4.0.0 org.springframework.boot:spring-boot-jms:4.0.0 org.springframework.boot:spring-boot-persistence:4.0.0 org.springframework.boot:spring-boot-sql:4.0.0 org.springframework.boot:spring-boot-starter-data-jdbc:4.0.0 org.springframework.boot:spring-boot-starter-jdbc:4.0.0 org.springframework.boot:spring-boot-starter-jms:4.0.0 org.springframework.boot:spring-boot-starter-logging:4.0.0 org.springframework.boot:spring-boot-starter:4.0.0 org.springframework.boot:spring-boot-transaction:4.0.0 org.springframework.boot:spring-boot:4.0.0 org.springframework.data:spring-data-commons:4.0.0 org.springframework.data:spring-data-jdbc:4.0.0 org.springframework.data:spring-data-relational:4.0.0 org.springframework:spring-aop:7.0.1 org.springframework:spring-beans:7.0.0 org.springframework:spring-context:7.0.1 org.springframework:spring-core:7.0.0 org.springframework:spring-expression:7.0.1 org.springframework:spring-jdbc:7.0.1 org.springframework:spring-jms:7.0.1 org.springframework:spring-messaging:7.0.1 org.springframework:spring-tx:7.0.0 org.yaml:snakeyaml:2.5 transactions-spring-boot4-starter ch.qos.logback:logback-classic:1.5.21 ch.qos.logback:logback-core:1.5.21 com.zaxxer:HikariCP:7.0.2 commons-logging:commons-logging:1.3.5 io.micrometer:micrometer-commons:1.16.0 io.micrometer:micrometer-observation:1.16.0 jakarta.annotation:jakarta.annotation-api:3.0.0 jakarta.jms:jakarta.jms-api:3.1.0 jakarta.transaction:jakarta.transaction-api:2.0.1 org.apache.logging.log4j:log4j-api:2.25.2 org.apache.logging.log4j:log4j-to-slf4j:2.25.2 org.jspecify:jspecify:1.0.0 org.slf4j:jul-to-slf4j:2.0.17 org.slf4j:slf4j-api:2.0.17 org.springframework.boot:spring-boot-autoconfigure:4.0.0 org.springframework.boot:spring-boot-data-commons:4.0.0 org.springframework.boot:spring-boot-data-jdbc:4.0.0 org.springframework.boot:spring-boot-jdbc:4.0.0 org.springframework.boot:spring-boot-jms:4.0.0 org.springframework.boot:spring-boot-persistence:4.0.0 org.springframework.boot:spring-boot-sql:4.0.0 org.springframework.boot:spring-boot-starter-data-jdbc:4.0.0 org.springframework.boot:spring-boot-starter-jdbc:4.0.0 org.springframework.boot:spring-boot-starter-jms:4.0.0 org.springframework.boot:spring-boot-starter-logging:4.0.0 org.springframework.boot:spring-boot-starter:4.0.0 org.springframework.boot:spring-boot-transaction:4.0.0 org.springframework.boot:spring-boot:4.0.0 org.springframework.data:spring-data-commons:4.0.0 org.springframework.data:spring-data-jdbc:4.0.0 org.springframework.data:spring-data-relational:4.0.0 org.springframework:spring-aop:7.0.1 org.springframework:spring-beans:7.0.0 org.springframework:spring-context:7.0.1 org.springframework:spring-core:7.0.0 org.springframework:spring-expression:7.0.1 org.springframework:spring-jdbc:7.0.1 org.springframework:spring-jms:7.0.1 org.springframework:spring-messaging:7.0.1 org.springframework:spring-tx:7.0.0 org.yaml:snakeyaml:2.5

Comments
Add a comment