- LogCloud recovery observability
- Feature230452Successful recovery actions are logged to a new LogCloud audit table
- Feature230474New read-only web viewer for the LogCloud tables
- Feature230516Configurable retention limit for the LogCloud recovery-log tables
- Feature230548LogCloud viewer shows subscription and license info per recovery domain
-
- Recovery decision arbiter
- Feature230781JMS pool: a connection broken asynchronously is no longer reused
- Bug218963Spring Boot 3.4: threaded two-phase commit can now be configured
- Bug228139LogCloud cross-service recovery no longer requires a shared tm_unique_name across services
- Bug230403PartitionedConnectionPool could transiently exceed maxPoolSize under concurrent growth
- Bug230421A failed commit-log write is treated as a heuristic hazard, not a rollback
- Bug230448A recovery-log write that crosses its deadline now fails fast
- SBOM — runtime dependencies are minimalistic
- About Severity
- Available to customers only. Want to become a customer?
ExtremeTransactions 6.0.119 hardens crash recovery (a sibling-branch atomicity residual is closed; a failed or dangerously-late commit-log write is now treated as a heuristic hazard rather than an incorrect rollback) and fixes JMS connection-pool reuse of a connection broken asynchronously (for example IBM MQ). It also adds LogCloud recovery-action auditing with a read-only viewer, and corrects cross-service recovery and Spring Boot 3.4 configuration. It is a drop-in replacement for earlier 6.0.x releases.
LogCloud recovery observability
ExtremeTransactions now records and surfaces recovery activity in LogCloud: successful recovery actions and heuristic outcomes are written to LogCloud tables (with a configurable retention limit) and are browsable in a new read-only web viewer, including subscription and license information per recovery domain.
Feature230452 Successful recovery actions are logged to a new LogCloud audit table
Description
Successful recovery actions - presumed aborts and replay commits - are recorded in a new LogCloud table, so recovery outcomes can be correlated across a transaction's branches rather than observed one event at a time.
Technical details
During recovery,XARecoveryManager records each completed action (presumed abort, replay commit) in a new LogCloud database table, alongside the per-occurrence events that already existed. This is an ExtremeTransactions (LogCloud) feature and is active when LogCloud is configured.
Changes impacting client API
None.
Feature230474 New read-only web viewer for the LogCloud tables
Description
A read-only web viewer browses the LogCloud tables - including the recovery-action and heuristic-outcome history - using keyset (cursor) pagination.
Technical details
A new optional portal component (transactions-logcloud-portal) serves a read-only UI and query API over the LogCloud database, using keyset (cursor) pagination rather than offset paging. It returns a clear error when the underlying tables are not present.
Changes impacting client API
A new, separately deployed component with its own HTTP endpoints; it does not change any existing API.
Feature230516 Configurable retention limit for the LogCloud recovery-log tables
Description
A configurable retention limit bounds the growth of the recovery-log tables, so a long-lived deployment does not accumulate rows without bound.
Technical details
RECOVERY_ACTION_LOG and RECOVERY_HEURISTIC_LOG gain a retention-based cleanup sweep. Previously only a per-key retry cap existed and RECOVERY_HEURISTIC_LOG had no bound at all, so a long-lived deployment could accumulate rows without limit.
Changes impacting client API
Two new configuration properties control the sweep:com.atomikos.icatch.logcloud_recovery_action_log_retention_days and com.atomikos.icatch.logcloud_recovery_action_log_max_rows.
Feature230548 LogCloud viewer shows subscription and license info per recovery domain
Description
The viewer's Subscriptions screen shows subscription and license information (licensee, expiry) per recovery domain.
Technical details
The viewer's Subscriptions screen lists recovery domains with their published subscription info (licensee, expiry), read without enforcement viaSubscriptionVerifier.readInfo() and published into the LogCloud startup configuration; a GET /domains endpoint backs the screen.
Changes impacting client API
A newGET /domains endpoint on the portal; no existing API changes.
Recovery decision arbiter
Recovery now resolves a rare atomicity edge case consistently: a decision arbiter records the first decision reached for a coordinator so every sibling branch follows it. The open-source edition ships an in-memory arbiter; LogCloud adds a durable, cross-node decision store.
Feature230638 Recovery: consistent decisions across a transaction's sibling branches
Description
A generic recovery-decision arbiter records the first decision reached for a coordinator and gates the replay-commit / presumed-abort paths on it, so sibling branches can no longer be decided inconsistently. The open-source edition ships an in-memory decision store.
Technical details
A generic recovery-decision arbiter records the first decision reached for a coordinator and gates theXARecoveryManager replay-commit and presumed-abort paths on it, closing a single-actor atomicity residual. The open-source edition ships an in-memory default decision store; the durable, cross-node store is a LogCloud feature (case 230734).
Changes impacting client API
None.
Feature230734 LogCloud: durable, cross-node recovery decisions
Description
A durable RecoveryDecisionStore backed by LogCloud JDBC makes the arbiter's decisions durable and consistent across nodes and restarts, so a stale or restarted leader cannot reverse a decision another node has recorded.
Technical details
A durableRecoveryDecisionStore backed by LogCloud JDBC records the first recovery decision per coordinator atomically (first-writer-wins via a UNIQUE constraint), with a SafeGC mark-then-sweep retention pass and a startup guard. It plugs into the case-230638 arbiter through a ServiceLoader seam. ExtremeTransactions (LogCloud) only.
Changes impacting client API
None.
Feature230781 JMS pool: a connection broken asynchronously is no longer reused
Description
A pooled JMS connection whose underlying connection has broken is no longer handed back out of the pool when the failure was signalled only asynchronously by the provider (for example IBM MQMQRC_CONNECTION_BROKEN). This means such a connection is now marked erroneous, destroyed and replaced instead of reused.
Technical details
Atomikos now registers its ownjavax.jms.ExceptionListener on the physical connection and marks the pooled connection erroneous on an asynchronous onException, so borrow validation rejects it. Any application-supplied listener (for example Spring's CachingConnectionFactory) is preserved and chained under Atomikos's, so both observe the break. Previously only a synchronous JMSException through a proxied call marked the connection erroneous.
Changes impacting client API
None. An application listener set through the pooled connection is chained, not replaced, sosetExceptionListener / getExceptionListener behave as before from the caller's point of view.
Bug218963 Spring Boot 3.4: threaded two-phase commit can now be configured
| Severity: | 3 |
|---|---|
| Affected version(s): | 6.0.x |
Description
The Spring Boot 3.4 starter now lets you configure threaded two-phase commit. This means thethreaded2pc property is applied, where before it was silently dropped.
Technical details
The Spring Boot 3.4 property binding was missing the mapping for threaded 2PC; it now maps through to thecom.atomikos.icatch.threaded_2pc transaction-manager property, matching the other starters.
Changes impacting client API
The Spring Boot 3.4threaded2pc property is now honoured (underlying property com.atomikos.icatch.threaded_2pc).
Bug228139 LogCloud cross-service recovery no longer requires a shared tm_unique_name across services
| Severity: | 2 |
|---|---|
| Affected version(s): | 6.0.x |
Description
Cross-service recovery under LogCloud no longer requires every service to share onetm_unique_name. This means a leader recovers transactions across services correctly, instead of only its own backends.
Technical details
The cross-domain import guard, which refused a transaction whoserecoveryDomainName differed from the local tm_unique_name when LogCloud was active, is relaxed to a warning. JDBCRecoveryLog gains an acceptsDomain check with a symmetric cache.
Changes impacting client API
None.
Bug230403 PartitionedConnectionPool could transiently exceed maxPoolSize under concurrent growth
| Severity: | 3 |
|---|---|
| Affected version(s): | 6.0.x |
Description
The partitioned connection pool no longer transiently exceedsmaxPoolSize under concurrent growth. This means the configured maximum is respected even when several threads grow the pool at once.
Technical details
reserveGrowthSlot() in PartitionedConnectionPool was an increment-then-check-then-rollback sequence, so a brief overshoot of one connection was observable under high concurrency; the reservation is now a single atomic step. Surfaced by a stress variant of the case-216947 pool test.
Changes impacting client API
None.
Bug230421 A failed commit-log write is treated as a heuristic hazard, not a rollback
| Severity: | 2 |
|---|---|
| Affected version(s): | 6.0.x |
Description
A transaction whose commit-log write fails or times out is now treated as a heuristic hazard rather than being rolled back. This means an uncertain log write no longer leads to an incorrect rollback decision.
Technical details
CoordinatorStateHandler.commitFromWithinCallback() previously caught every RuntimeException during the transition to COMMITTING and always threw RollbackException, conflating a failed/uncertain write with a legitimate recovery-driven rollback. A failed commit-log write is now classified as a heuristic hazard. Backport of case 168377.
Changes impacting client API
None.
Bug230448 A recovery-log write that crosses its deadline now fails fast
| Severity: | 2 |
|---|---|
| Affected version(s): | 6.0.x |
Description
A recovery-log write that crosses its deadline during the database insert now fails instead of returning normally. This means a dangerously late log write is handled consistently, however the lateness is detected.
Technical details
JDBCRecoveryLog.write() had two divergent paths for a dangerously-late commit-log write: a failed/timed-out write threw, but a write that succeeded yet crossed the deadline on the post-insert hasExpired() check only published an event and returned. Both now throw, so the downstream heuristic-hazard handling (case 230421) applies uniformly.
Changes impacting client API
None.
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
ExtremeTransactionsForMaven ate atomikos-util axt extreme-transactions extreme-transactions-jakarta products spring-boot2 spring-boot3 spring-boot3.4 spring-boot4 subscription transactions transactions-allegrograph transactions-api transactions-eclipselink transactions-essentials transactions-essentials-jakarta transactions-hazelcast transactions-hibernate2 transactions-hibernate3 transactions-hibernate4 transactions-jdbc transactions-jms transactions-jmx transactions-jndi-provider transactions-jsp transactions-jta transactions-logcloud transactions-logutil transactions-micrometer transactions-monitoring transactions-monitoring-logs transactions-monitoring-stderr transactions-opentracing transactions-osgi transactions-osgi-axt transactions-remoting 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