187515: Avoid retrying commit after failure of 1PC
Fixed a bug where retry of a one-phase commit would lead to needless heuristic hazard warnings (and pool congestion). It does not make sense to retry 1-phase commit because, for instance, a typical failure could be cause by a transaction timeout in the resource.
These can be used to cleanup pending Spring state. Normally this is done by Spring's JtaTransactionManager, but in case of pending transactions on a Tomcat request thread, the Spring transaction cleanup may not happen. In those cases, you need these filters or you will see weird warnings like these:
WARNING: Attempt to use connection after it was closed.
Adding these filters should prevent that.
Available to customers only. Want to become a customer?
168377: Error during log flush: treat as heuristic hazard, not as rollback
We've refined exception handling for the rare case where flushing a commit record to the log fails.
176189: Reap: avoid connection reuse in nonxa
Although unlikely, reaping would attempt to mark the connection as reusable before it was destroyed in the pool. In theory this could give race conditions so we have improved that.
176244: XAResourceTransaction.commit/rollback: log warnings only once
We used to log two times the same warning in some exceptional cases, this has now been improved.
175872: Avoid locking the whole pool when creating a new connection
While growPool was executing createPooledConnection, it had a lock on the entire pool. In case of network timeouts, this can take a long time and this forbids other threads from getting a connection. We've fixed this.
Available to customers only. Want to become a customer?
175391: Reap should destroy the pooled connection to free up space in the pool
Due to recent community changes that were merged in the stable branch, we accidentally omitted deleting a connection from the pool after it was reaped. This is now fixed.
Available to customers only. Want to become a customer?
175280: TransactionManagerLifecycleListener: improve stop support to avoid closing resources for active Spring MessageListenerContainers
This listener class for Tomcat integration used to shutdown the transaction core on STOP events. Due to (lack of) ordering during such STOP lifecycle event, there may still be active web applications when this is called. As a result, any remaining message listeners will start giving warnings that the core has already been shutdown, along with its JMS resources.
This has been fixed, at the expense of a different (but less intrusive) warning like this one:
The web application [/...] appears to have started a thread named [Atomikos:5] but has failed to stop it. This is very likely to create a memory leak.
This is due to the limited knowledge the Tomcat core has about Atomikos threads. It can be ignored, there is no memory leak in this case.
Available to customers only. Want to become a customer?
It does not make sense to have connections in use for more than maxLifetime, so now we reap in that case. This is to avoid pool exhaustion if connections are held and blocked for a long time.
174127: Enable JMS to use the new concurrent pool for high performance
It is now possible to also use the new pools with JMS.
168918: REST/SOAP: add recovery domain name to propagation
For safety reasons, we now add the recovery domain name to the transaction propagation - so we avoid transactions across recovery domains.
172441: XAResourceTransaction: don't log error on heuristic states
Heuristics are the responsibility of the recovery module in the background, so it is not necessary to log errors in the OLTP module.
Available to customers only. Want to become a customer?
172665: Prepare failure: clarify error log even more
Experience has shown that failures during prepare can result in confusing exception messages. We've tried to improve this even more.
172436: JDBC/JMS: clarify message if pooled connection cannot be gotten
Per customer request, we improved the error message if no connection could be gotten from the pool in both JMS and JDBC: instead of Failed to grow the connection pool it now says Failed to create a connection.
172905: Allow transition from PREPARING/COMMITTING/ABORTING to ABANDONED
Fixed a bug where transactions were not cleaned up after timeout - thereby possibly causing a memory leak in the core.
173314: Log number of open contexts in a pooled connection
Added (trace-level) logging to show the number of open contexts for a pooled connection when the pool checks its availability.
We no longer log a warning when trying to create a new connection with a custom userName and password. This is because some frameworks depend on this method, which causes a lot of noise in the logs. Instead, we now log this in debug level.
Available to customers only. Want to become a customer?
172566: Improved support for maxLifetime enforcement
Even though we had a maxLifetime for connections in the pool (to avoid firewall issues), this was only applied to connections that were available at the exact moment when the pool's maintenance thread was doing the checking. This has now been improved: even if a connection is not available at the time of checking (i.e., in use by the application) it will to be reused again after its maxLifetime has passed.
172524: Race condition in ConnectionPoolWithConcurrentValidation on destroy of pooled connection
The new pool had a race condition between the application threads and the pool's maintenance thread, as follows:
The maintenance thread would do the following - without the synchronisation of our older pool:
Loop over all connections to check which ones are available.
Close (destroy) any such available connections that it deemed no longer needed.
In parallel, the application threads would be getting connections from the pool. This means between steps 1 and 2 of the maintenance thread, it could happen that a connection was gotten from the pool and subsequently destroyed by the maintenance thread.
This has now been fixed.
172571: CleanupPendingTransactionContextFilter: improve behaviour and enable toggling via property
Our servlet filter takes care of cleaning up any pending transaction context for applications that don't cleanly end the transaction association of the calling thread. Previously, this happened only when the thread was reused for a later request (via thread pooling in the servlet container). This can take time, and the resulting warnings are hard to link back to the original request.
This has been improved by making the cleanup also happen directly after each request (rather than waiting until a next request comes in).
Also, per customer request we've made it possible to "disable" this filtering behaviour if required, by setting the property
com.atomikos.icatch.http.filter_requests=false
This can happen either in the jta.properties file, or via a System (JVM) property. This way, you can leave the filter in your web application's web.xml file - which should make life a bit easier on the operations people.
169220: Specify a timeout for the testQuery
We now reuse the borrowConnectionTimeout value as the timeout for the testQuery - so testQueries don't block indefinitely and the pool's availability is improved.
172247: AtomikosDataSourceBean: don't log testQuery warning for concurrentConnectionValidation mode
Historically, a testQuery would generate warnings regarding performance. With the new concurrent validation pool, this is of course no longer required.
Available to customers only. Want to become a customer?
In addition to REST support, we've added a new incarnation of our SOAP web service transaction support. Once more you can make transactions span web services, but this time it's not according to the inefficiencies of a bloated standard specification. Rather, it's the way we think it should be - no compromises!
171909: Publish event when setRollbackOnly is called
We now publish an instance of TransactionRollbackOnlyEvent whenever there is a call to setRollbackOnly. Just listen for the event, and chose how to handle it (e.g., by logging a warning with the stack trace of the calling thread so you can diagnose what component is causing issues).
170752: Log JDBC/JMS init as INFO so it is easier to find mistakes
We now log init calls as INFO so it is easier to find mistakes in the configuration.
Available to customers only. Want to become a customer?
170445: Improve ClassLoadingHelper to allow proxies for classes with non-public interfaces
When loading from different jars, non-public interfaces in the vendor's drivers could sometimes lead to proxy creation failures for the JMS session. This was notably the case for Tibco EMS. We now catch the error and create a minimal working proxy instead.
Warning: Known Issues With REST Demos
Some of the REST demos don't work in this release - this will be fixed in an upcoming release. This will only affect development projects that are testing REST transactions.
Available to customers only. Want to become a customer?
170331: Add connectionValidationInterval so JDBC connection validation will be repeated every X milliseconds
You can now set the interval after which JDBC connection validation should be repeated, so users can have an application-specific impact on performance.
170195: Tomcat JNDI integration: allow setting XADataSource via JNDI
Similar to JMS, we added the capability to specify the XADataSource as a JNDI reference in Tomcat.
170194: Tomcat JNDI integration: allow setting vendor XA connection factory via className
Similar to JDBC, we now also allow specifying the XA vendor settings via the class name (instead of only the JNDI reference).
164168: ConnectionPool's onXPooledConnectionTerminated method: publish event out of synchronised block
Another incremental performance optimisation to maximise performance.
Warning: Known Issues With REST Demos
Some of the REST demos don't work in this release - this will be fixed in an upcoming release. This will only affect development projects that are testing REST transactions.
Available to customers only. Want to become a customer?
167173: Utility to decode hex-XIDs reported by the back-end resource monitoring tools.
You can now use the LogUtil tool to decode hex-XIDs so you get values that make sense for your configuration. See here for the documentation.
169575: Logging: increase concurrency by limiting use of synchronized blocks
We've eliminated some logging contention points by replacing synchronized blocks with reentrant locks (shared versus exclusive).
169171: Fixed bug in CleanupPendingTransactionContextFilter
We incorrectly passed a milliseconds value for the JTA timeout - which expects a seconds value. This would lead to numerous log warnings like: "Attempt to create a transaction with a timeout that exceeds maximum - truncating to xxx". This has now been fixed.
169144: Bug in subtransaction create: rootId is wrong
Creating a subtransaction did not set the correct root, which made it hard for different subtransactions to share locks.
168653: REST/ACID: add "serial" header for lock sharing among siblings
We've added a special header to facilitate lock sharing among related transactions across different incoming REST calls.
168910: REST/ACID: add root's ID to propagation
We've added the root transaction to the propagation headers to facilitate lock sharing among related transactions across different incoming REST calls.
169023: REST/ACID: add "extent" to response headers so we can tolerate retries
Failed remote calls can now safely be retried without risking duplicate transactions at the remote end.
166698: Fixed timeout errors in Hazelcast demo
This demo has now been fixed.
167897: LogCloud 3rd party demo not working
This demo has now been fixed.
167899: Spring/Tomcat demo not working
This demo has now been fixed.
Warning: Known Issues With REST Demos
While testing this release, we've noticed that some of the REST demos no longer work - this will be fixed for the next release. This will only affect development projects that are testing REST transactions.
Available to customers only. Want to become a customer?
Check out our new high-performance JDBC pools and more!
94285: Refactored connection pool with concurrentConnectionValidation
Refactored the connection pool: the testQuery is now executed outside of a synchronised block for better performance.
165262: Configuration.shutdown methods should log INFO message
In-line with INFO logging policies, shutdown methods now log an INFO message.
166914: ConnectionPool.borrowConnection: move testQuery execution outside of synchronised block
The testQuery used to be in a synchronised block, now this is no longer the case thanks to a new pool implementation. This is a port of fix 94285 (commercial branch) to the community.
A call to borrowConnection() used to become blocked due to one thread entering canBeRecycledForCallingThread() it that then waited for the SessionHandleState lock - if in use by another connection at the same time. We fixed this by making canBeRecycledForCallingThread() returning false without locking.
167189: JDBC/JMS connectors: create JNDI reference only after pool is created
We now create the JNDI reference only after the pool has been created - it does not make sense to expose a faulty pool.
167206: Improve logging - clarify "Prepare: NO vote"
We've clarified the error reporting to make it clearer what happened, and avoid confusion.
167208: Improve log warning for transaction timeout message
We've improved the logging for timeouts - to avoid confusion.
167209: Don't refresh XAResource for 1-phase commit
We used to refresh to XAResource on connectivity issues. Refreshing made little sense in case of 1-phase commit because there is no prepared transaction XID in the datasource, meaning a different connection would probably not know about it.
167220: Ensure that testQuery has no pool overhead
This is one of the best performance improvements we ever made: we now ensure that the (new) pool does not impact performance when setting a testQuery. This makes our pools about as fast as non-JTA/XA pools, meaning reliability comes without the performance cost for your application! (Check our commercial offerings if you want even more…)
167530: Recovery bug: init/checkpoint does not take the purge delay into account
Fixed a bug in the new recovery where checkpoints would purge too much.
Fixed a synchronisation bug that would show up under high loads and would lead to incomplete checkpoints.
167358: REST/ACID: ParticipantAdapter should implement equals to avoid duplicate 2PC towards same backend
Fixed an issue with missing equals/hashCode implementations that would break 2-phase commit in certain conditions.
167400: New pool: avoid testQuery overhead on connection recycle
We've added a new pool that makes the testQuery more efficient. Now, we went even further and avoid the testQuery overhead on connection recycling. This mainly makes it faster for transactions that do multiple SQL statements in the same transaction.
167418: CleanupPendingTransactionContextFilter: also reset ThreadLocal transaction timeout
Thread reuse in Tomcat used to inherit the transaction timeout set by a previous request (if any). This could be confusing so we now reset the transaction timeout between requests.
167528: Tune default checkpoint interval for extra performance
The default checkpoint interval used to be suboptimal for performance - our commercial distribution is now tuned in this respect.
Available to customers only. Want to become a customer?
Clarified with missing instructions for seamless testing of the demo.
166386: Setting com.atomikos.icatch.max_timeout=0 means unlimited
Improved the new recovery to interpret 0 as unlimited, and we now log a warning if this happens with XA.
166601: Allow delegating JNDI lookups to underlying platform implementation
We've improved our transactions-jndi-provider module: if you use our com.atomikos.jndi.AtomikosContextFactory as the initial context factory then you can delegate unbound lookups to a third-party provider specified as "env."-prefixed properties in the jndi.properties file.
For instance: env.java.naming.factory.initial = … would set the third-party context implementation to delegate to.
166271: LogCloud: conflict between TCC and XA recovery
When deploying the LogCloud there is a conflict between TCC and XA mode - mostly due to timeouts during recovery. We've now made sure that there is better separation to avoid issues with this: either the subsystem starts in XA mode (default) or in TCC mode (if the TCC classes are found on the classpath).
Available to customers only. Want to become a customer?
166145: LogCloudRmiServer: lookup recovery delay in config properties
This class used to take a separate parameter on the command line - thereby hiding the value specified in the jta.properties file. This has been fixed.
166164: Bug in ACID/REST demo
Fixed a bug in the demo: the inventory should not return "Accepted" status for updates.
166167: ACID/REST: added client-side checks to prevent commit when there are outstanding remote calls
It should not be allowed to have a commit when some calls are still pending - since the commit scope will not be well-defined in that case. We now have a check for that.
166171: TransactionAwareRestContainerFilter: timeout must be relative to System time
Fixed a bug where the timeout was confused with the expiration date/time in the request header of incoming requests. This would lead to excessive timeouts.
166211: ACID/REST: container (server-side) filter should not add participant header on rollback
For extra safety, we've improved the filter to omit any headers in case of server-side rollback. This way, the client transaction manager cannot get confused and still attempt commit.
166212: ACID/REST: client filter should rollback if transaction was propagated but no participant link header returned
Because of the previous case (166211), the client should not commit a transaction where there is no participant for the remote work. Otherwise, the transaction commit scope would be undefined.
165415: ACID/REST: allow exporting any local JTA transaction
We've improved the examples and added support for both JAX-RS and Spring REST/MVC - so you can build microservices with your favourite toolbox.
165427: ACID/REST: add logging so we can see what happens
We've improved logging in the REST module - so it's easier to see what happens.
165799: New datasource property concurrentConnectionValidation: also log on init
It seems we did not log this new property value on init yet. This has now been fixed.
Available to customers only. Want to become a customer?
We've added a new property on our datasource classes: concurrentConnectionValidation. When set, the pool will do the connection validation (either a testQuery or JDBC4's isValid function) outside any synchronised blocks of code - so performance is much better.
165415: ACID/REST: allow propagation of any local JTA transaction along outgoing REST calls
Applications that embed an Atomikos transaction manager can now transparently make JTA transactions span outgoing REST calls.
165580: ACID/REST demo: add JavaScript client
We now have a plain JavaScript client to show how non-Java clients can still use our REST transactions.
Available to customers only. Want to become a customer?
Improved exception handling: occasionally, would would swallow exceptions (shame on us!).
165163: Always execute testQuery in autoCommit mode
The testQuery used to execute with an undefined autoCommit mode - so if the connection had autoCommit disabled, the testQuery would start a new (local) transaction context that conflicts with XA.
165281: Log stack trace of getConnection() after reaping
To facilitate finding connection leaks, we now start collecting and logging stack traces of getConnection() calls after the first reap.
165415: ACID/REST: allow exporting any local JTA transaction over REST
From now on, all local JTA transactions can be exported / extended over REST - so outgoing REST calls can become part of the commit scope.
Available to customers only. Want to become a customer?
Quick fix for recovery of expired transactions, relevant to all 4.0.x users.
164147: Recovery of expired committing Xid fails
Fixed a bug where recovery of an expired committing Xid failed silently. As a result, expired committing entries would stay in the transaction log because this would fail on every recovery scan. This has now been fixed.
Available to customers only. Want to become a customer?
162961: LogCloud service failover and out-of-memory protection
We added a monitoring service for the LogCloud so failed processes are automatically restarted, which increases availability. We also added memory monitoring for timely warnings of possible out-of-memory conditions, as well as useful logging hints on how many concurrent transactions are supported in the current configuration.
163761: Save current pid of LogCloud process
We now save process id of the running process, so wrong restarts of the monitoring tools can show a meaningful error message. Currently available for unix-type platforms only.
164057: LogUtil: format XIDs like in the diagnostic logs
We improved the monitoring utilities to make it easier to correlate XIDs in the transaction log (JSON format) with XIDs in the diagnostic logs. Due to different formatting rules, this was difficult.
Available to customers only. Want to become a customer?
Introducing… REST/ACID transactions across microservices!
158377: Support ACID transactions across REST (micro)services
See the examples-jta-rest sample for a working demo…
162082: Sub-transaction bug: no recovery coordinator for local sub-transactions
Fixed a bug where local sub transactions would not be recovered.
162083: XID recovery for imported ("recreated") transactions: wrong coordinatorId
Fixed a bug where imported transactions would sometimes not get the right coordinatorId for recovery.
162087: Imported transactions get same coordinatorId as the root
Improved the import mechanism for microservice transactions to ensure correct recovery in all cases.
162532: LogCloud service: add log alert when approaching out-of-memory
Added a log warning when there an out-of-memory is approaching.
162596: LogCloud recovery of TCC interferes with XA recovery
Improved mixed recovery where the Main.LogCloud would interfere with XA recovery.
162685: Refactor RMI examples to use LogCloud
We now show the Main.LogCloud in the examples with RMI.
162772: Add JMX support for non-xa datasource
JMX is now also supported for non-xa datasource instances.
162773: Add option to disable startup if resource not available
Our datasources now have an optional failOnInitIfDatabaseDown setting, and the AtomikosConnectionFactoryBean has a similar failOnInitIfBrokerDown option - both of which will make the init fail if the backed resource is not available at the time of init.
162771: Spring support: also init/destroy JMX beans
We've added support for managing JMX beans in our Spring integration - so you don't have to.
Available to customers only. Want to become a customer?
159112: Add TimeoutException class / subclass of RollbackException
We've added a dedicated TimeoutException (subclass of RollbackException) so applications can catch this specific exception to be informed about timeouts.
160683: Add specific events to the connection pool for borrowing / returning connections
Applications can now register event listeners to be informed about PooledConnectionBorrowedEvent and PooledConnectionTerminatedEvent instances - so the application can roll its own monitoring if desired.
159813: Log recovery actions as warnings so logs are easy to check after an issue occurs
Recovery now logs warnings so it's hard to miss important recovery actions.
Available to customers only. Want to become a customer?
158901: Tomcat integration: add JNDI config / lookup of 3rd party JDBC/JMS factories
We've added a demo config also to the regular (non-Spring-based) Tomcat examples.
159319: New recovery: avoid recover/rollback between prepare and commit
We fixed a design flaw where the new recovery could suffer from interference of concurrent recovery / rollback. Our fix has been proven mathematically correct so we're pretty convinced this makes things bullet-proof from now on.
159773: Detect changes after init concerning setSupportsTmJoin
We've improved supportsTmJoin functionality to be consistent with the other AtomikosDataSourceBean properties.
Available to customers only. Want to become a customer?
159517: Allow UserTransactionManager init with customer configuration properties
You can now construct an instance with custom init properties that will be taken into account.
159580: Improve supportsTmJoin to never use TMJOIN at all
We've widened the impact of supportsTmJoin=false to avoid all XA joins completely - so you can work around problems with XAResource implementations that lack decent support for this.
Available to customers only. Want to become a customer?
157119: Log stack trace of thread that leads to transaction timeout
Improved existing fix with respect to logging frequency: we now only log stack traces once, instead of on every timer alert after a timeout happens. This reduces logging volumes quite a bit.
157685: Improve init logic upon exceptions in new recovery
Init-ing datasources or connection factories with an unavailable backend would lead to startup failures in some cases; this has now been fixed.
156814: Add a LogCloud REST API so 3rd parties can reuse the recovery module
For those who want do do their own "transaction management" but delegate recovery to Atomikos: we've opened up the LogCloud with a REST API. See the relevant examples for more information.
157787: TCC/REST: create fat jar so the coordinator service is easy to launch
It is now easier than ever to start a coordinator service for your TCC transactions: just launch java -jar transactions-tcc-rest.jar 8080 (or replace 8080 by whatever port you want to use).
Available to customers only. Want to become a customer?
157457: XaResourceRecoveryManager: log XID in same format as XAResourceTransaction
The new recovery module logged XIDs in a different format than the OLTP logic did, which was confusing to read. We've now aligned them.
157119: Log stack trace of thread that leads to transaction timeout
Timeout / setRollbackOnly of an active transaction now also shows the stack trace(s) of any threads that were active in the transaction - so it is easier to find out what is causing the timeout.
157408: Clarify log warning message if timeout is maxed
Improved the warning message by also suggesting what can be done to avoid it.
141026: CleanupPendingTransactionContextFilter: add INFO logging
Added useful extra logging to show what is going on.
156021: LogCloud: print / show generated RMI url so client configuration is easier
The LogCloud service now displays the RMI address on which it is available - so clients are easier to configure.
156982: LogCloud requires different UniqueIdMgr implementation
We've improved the way that transaction identifiers are generated so the probability of collisions in cluster deployments is minimised.
157196: Add logging to AtomikosApplicationContextAware
Our Spring integration module now also logs what it is doing, in what order.
157485: Spring integration: allow integrating the UserTransactionServiceImp in the right order
It is now also possible to include the UserTransactionServiceImp with our built-in Spring integration - so you can tune the init properties inside your Spring config.
Available to customers only. Want to become a customer?
156968: New recovery: call refreshXAConnection when errors during recovery
Improved handling of erroneous connections for recovery: in some configurations the connection can be broken, and needsRefresh does not seem to detect this - resulting in repeated recovery errors on each scan. We now refresh the connection automatically after any recovery error.
155758: Recovery: refine to better deal with heuristics
Heuristic log entries are now automatically discarded when all participant entries are either terminated or heuristic. Upon discarding, we generate an event to allow for monitoring in external tools.
155987: Recovery: improve termination for parent/subtransaction
Improved the housekeeping of the log for parent/subtransaction situations.
155986: Recovery: improve getCommittingParticipants() for sub transactions
Subtransactions could be pending in the INDOUBT state while the parent transaction was logged as COMMITTING. The only correct recovery for the sub transaction is to commit, so getCommittingParticipants() should return the participants of the subtx.
This exotic optional feature was not safe with the new recovery and also not compatible with the LogCloud.
156249: Recovery: include name of XAResource
We now use the uniqueResourceName of each resource to improve the housekeeping of pending log records.
155974: Subtransaction recovery can rollback when parent transaction is committing
Fixed an issue where sub transaction rollback was possible during recovery, when the parent did commit.
155982: Logging of sub transactions with new recovery does not include superiorCoordinatorId
Logging for sub transactions was incomplete and did not include the parent transaction's id. This is now fixed.
156956: Allow presumed abort of IN_DOUBT subtransaction if its parent is HEUR_HAZARD or HEUR_MIXED after ABORTING.
Improved recovery for subtransactions with problematic parent transactions.
156967: Presumed abort should work for log entries in ABORTING state
Pending log entries in the ABORTING state will now also be cleaned up during recovery.
156924: Ignore non-recoverable states in checkpoint
Non-recoverable states like ABORTING (created during recovery) don't have to be logged because they are reproducible on the next recovery scan. We now avoid writing such entries.
156943: Recovery with commit replay: also return heuristic entries where wasCommitted = true
We now also correctly recover and commit IN_DOUBT participant entries when the overall outcome is some form of heuristic.
We found and fixed a race condition where synchronisation was lacking.
156812: Generate event for pending COMMITTING/ABORTING log entries so the resource can be added to the config if needed
For operational monitoring, we now generate a warning event when a resource may have been removed from the configuration while it still had pending transactions in the recovery logs.
Improvements of the LogCloud
156391: LogCloud: also register Hazelcast resource
You can now also use Hazelcast with the LogCLoud.
156617: LogCloud: support xaPropertyNamesToHide
Sensitive connector properties are now encrypted over the wire and on disk.
Hazelcast is now also supported as a LogCloud resource.
Other
156015: Added new config property with max wait timeout during shutdown in no-force mode
The new property com.atomikos.icatch.default_max_wait_time_on_shutdown allows configuring the max number if milliseconds that shutdown will wait when in no-force mode.
156355: Example with Hibernate 5
Added a new example with Hibernate 5.
156798: Timeout with marked abort: log warning to explain reason of NO vote
A timeout of an active transaction will add a RollbackOnlyParticipant to make prepare fail. However, later on in the logs this shows up as a NO vote cryptic error that people didn't understand. This has now been improved.
155988: Race condition between recovery / presumed abort and OLTP commit: improve error message
When recovery interleaved with application-level commit attempts, sometimes the following cryptic message would be in the logs:
javax.transaction.RollbackException: Error in committing: Existing entry: ABORTING incompatible with new entry: COMMITTING - recovery will clean up in the background
We've changed this to point out that intermediate recovery is responsible for this situation.
156800: Allow OLTP state transitions from ABANDONED to TERMINATED and the other way around
We've loosened state transitions a bit to avoid needless warnings in the logs.
Available to customers only. Want to become a customer?
154438: Support for JDBC4 isValid connection testing
We've implemented support for JDBC4 isValid connection tests by the driver. To enable, set useDriverBasedConnectionValidation to true on the AtomikosDataSourceBean.
155331: Tomcat JNDI: add 'singleton' as a property to ignore
The Tomcat JNDI factories specify an internal 'singleton' property that generates warnings when set on Atomikos datasources or connection factories. This property is now being ignored to avoid needless warnings.
Available to customers only. Want to become a customer?
TCC/REST improvements and samples for parallel sub transactions in multi-threaded applications…
154988: Improved TCC error handling upon confirm
We recently switched to the new JAX-RS 2.0 client API, thereby giving up checked exceptions on client calls (in favour of response codes that need to be checked explicitly). This caused us to miss on some HTTP error codes, which has now been corrected.
154950: Add example showing how to do threaded (sub)transactions
For those who need parallel processing in their transactional applications, we've now added an explicit example of that. See examples-jta-multithreaded in the examples download.
Available to customers only. Want to become a customer?
154549: TCC/REST: force cancellation when one or more services are down before confirmation starts
We've optimised the confirmation process to check availability of all participants before attempting to confirm, in order to avoid needless 409 conflicting outcomes.
154789: Add parameter to disable recovery
The existing init parameter com.atomikos.icatch.enable_logging has a new optional value to disable recovery altogether:
This will install a NullRepository for logging purposes, so the transaction logs will always appear attempt and recovery will not do anything. The second parameter is needed to avoid OLTP retries ("recovery") of heuristic transactions.
Available to customers only. Want to become a customer?
This release contains all the functionality of our 4.0 release with 100+ commercial bug fixes between 3.9.0 and 3.9.34. As such, this is the first stable customer release of the 4.0.x branch.
Available to customers only. Want to become a customer?
We've done various little changes to make the example programs and/or the free trial experience better or more ergonomic. There were no known bug reports so we don't bother mentioning each individual case here.
150080: Use the new JAX-RS 2.0 standard client API so our TCC implementation does not have hard dependencies on CXF
JAX-RS 2.0 has a new standard client API so our code now works (in theory) with any compliant implementation.
153552: TCC/REST recovery
It seems that we forgot to activate TCC recovery in prior releases - this is now fixed.
Available to customers only. Want to become a customer?
The immediate benefit of the redesigned recovery and logging mechanism is that customers can now configure an external logging and recovery service - allowing you to dynamically add / remove application processing nodes without impacting recovery. For more details, see Main.LogCloud.
TCC
We've open-sourced TCC for REST ( Try-Confirm/Cancel) so it becomes accessible to everyone. We (and many others who gave us feedback) are convinced that TCC is the ultimate transaction model for REST. We would be honoured if you (re)used our implementation for your needs, and please let us know if you see any ways of improving it. In case you wonder if we are giving up on monetising TCC: we're not - rather, we intend to provide commercial value-add modules for various cloud deployments that are not provided by the pure open source distribution.
Redesigned Recovery and Logging
We've completely redefined how logging and recovery work. As an added bonus, this new design also simplifies the regular transaction processing code (recovery is no longer a concern) and should reduce memory usage during normal operation - while also making heuristic cases less of a burden.
The .epoch file mechanism is no longer used - which in turn improves cloud friendliness of our product.
The logs are now in a human-readable text format for optimal comfort during administration.
API Redesign
Extensibility
On the implementation side, we've redesigned the transactions-api module and the transactions core to be based on a plugin architecture so the core can be agnostic about the various extensions (such as JTA, RMI and TCC). This means that we now have a generic transaction model in our core, which can be adapted to specific needs via external plugins of which the core needs to have no knowledge. We're hoping that future contributions as well as our own commercial extensions can benefit from this new design. Extensions are based on the ServiceLoader mechanism. The TSListener interface has been refactored and renamed to TransactionServicePlugin and it has become the main plugin interface for this architecture.
In the same style, we've added core event notifications to our API, so plugins and external modules can be notified about significant transaction events. This makes it possible to build monitoring utilities on top of our product - both by the community and commercially by us.
Redesign of init property lookup
Initialization properties are now resolved in the following order (for inspiration from the community, see this forum post):
defaults are loaded from the classpath
any overrides from transactions.properties (if found in the classpath) are applied
any overrides from jta.properties (if found in the classpath) are applied
any overrides in a properties file specified by the optional system property com.atomikos.icatch.file are applied
any overrides set in a programmatic way are applied
any overrides set a system properties are applied
placeholder substitution is done for the resulting set of properties
Removed SubTxThread functionality
This functionality seemed a bit exotic to carry on in our codebase, so we've optimistically removed it for now. Should there be compelling use cases to add them again, we will do so at a later time. Most of our user base adheres to the JTA/JDBC/JMS API and will not be affected at all by this removal.
New configuration properties
See Documentation.JtaProperties for specific changes as of 4.x.
Custom JNDI Provider
To facilitate integration we now also have a custom JNDI factory in module transactions-jndi-provider. Among other things, it makes it easier to have Hibernate find our datasources if you're not using Spring.
Re-organised JMX support into transactions-jmx and transactions-jmx-jta
JMX support is now divided across 2 modules; one transactions-jmx (core) module and also transactions-jmx-jta for specifics relevant to JTA.
Modern Hibernate Examples
Last but not least: we now have a Hibernate 4 example included - thanks to Torsten Krah! There is now also a standalone Hibernate example to show how our JNDI provider works.
System Requirements
This release requires at least Java 1.7 to run. We do not guarantee compatibility with older versions of the JDK.
How To Upgrade
Make sure to shut down in no-force mode first, and delete the logs of your old version (which is safe after no-force shutdown).
If you don't use the transactions-api directly then your application should work fine (still, be sure to check our new init property lookup!).
If you do use our transactions-api then you might want to check the following:
The Configuration class was moved to package com.atomikos.icatch.config.
The UserTransactionService no longer has the init(TSInitInfo) method: initialisation now takes either no arguments, or a java.util.Properties argument.
72517: Add common interface for JMS sender templates
You can now use the comment interface JmsSenderTemplate in your dependency injection so you don't depend on concrete classes.
133319: Allow java.lang.Object methods after connection is closed
For compatibility with third-party code expectations we now allow methods like hashCode to be called on closed connection handles.
142795: Optimisation for concurrent load with TemporaryXATransactionalResource
Contributed by Christoph Schmidt-Casdorf, Deutsche Post.
119178: Make setTransactionTimeout thread-local
The setTransactionTimeout is now thread-local so threads do not interfere if they set this property.
141014: Configuration property to disable nested transactions when desired
You can now prevent nested transactions from being started - see Documentation.JtaProperties for details.
149260: Log less in INFO mode
We have refined and improved the way we log: see Documentation.ConfiguringTheLogs for details.`
147436: Exceptions concerning log and/or configuration files should report the expected file location
Exceptions now report the expected file location so debugging your configuration is easier.
149698: Require SLF4J 1.4 or higher so trace level is supported
For our new logging policies we need trace and this is only available in version 1.4 of SLF4J.
148495: Move methods from deprecated TransactionControl to CompositeTransaction and remove TransactionControl
The TransactionControl interface has been removed from our API and its remaining functionality has been merged into the CompositeTransaction interface.
70515: Participant: refactor from Dictionary to Map
The Map is cleaner at API level (not a JDK implementation class).
142795: Optimisation for concurrent load with TemporaryXATransactionalResource
Added a contributed improvement for dynamically registered XAResource instances so we avoid race conditions under high load.
116801: Redesign recovery to avoid serialising participants so we keep memory usage low and minimize heuristic overhead
We now avoid serialisation with our brand-new recovery implementation.
135128: Separate OLTP logic from restart/recovery logic to simplify the transaction states and handlers
OLTP logging and restart/crash recovery logic are now separated, which simplifies the transaction state handlers and puts us on the road to improved compatibility with cloud deployments.
87768: Configurable wait timeout during shutdown
Shutdown used to be binary: either you waited for active transactions to finish, or not. We've now added an option of specifying a timeout in milliseconds. The system will wait for active transactions to finish within the specified delay, and resort to forced shutdown after that.
148219: Dynamic XAResource registration: use hashCode rather than toString to generate a resource name
We changed this in an attempt to make resource names more unique. A more profound solution will be available in a later release, when we improve dynamic resource registration.
This feature is no longer needed in our modernised code base so we have removed it.
135349: Make build work with JDK 7/8
The build now works on/with the latest JDK versions.
136943: PropertyUtils should support all Java primitive types
All built-in primitive types are now supported.
127224: Use the new RecoveryScan utility class for XA recovery
No comment needed on this one - it is an internal issue.
117665: One big zip file for all demos/examples so administration is easier
We've added one big zip file for all demos - this is simpler to handle for everybody.
116968: Re-enable and fix OSGi examples in build
The OSGi examples are now included again. Previously, they were excluded because the build used to fail on them.
117662: TCC/REST coordinator service emits Content-type instead of Accept header
Our coordinator service implementation did not properly set the Accept header when confirming a participant service. This has been fixed.
117742: Refine UserTransactionManager behavior after close - for increased usability
The following methods are sure to be allowed after close: rollback, setRollbackOnly, suspend, resume.
117362: Added documentation section on transaction events
Documented the event mechanism (in the PDF guide covering the API).
117090: Added easy way to launch a coordinator server for TCC
It is now possible to quickly launch a coordinator server from the TCC demos so you can easily test your own participant services for compliance.
116759: Included community fixes from 3.9.0-3.9.3
See ExtremeTransactions3dot9dot3 for details.
116758: Example for Hibernate 4 integration
Added runnable example to demonstrate Hibernate 4 integration.
115604: Increase logging level to ERROR for errors in beforeCompletion Synchronization callbacks
The log level has been increased to avoid losing time chasing errors that happen during beforeCompletion and prevent committing the transaction.
116649: Hibernate4 support: Atomikos JTAPlatform
We now support hibernate 4 in an easy way, as demonstrated by the corresponding new examples.
94676: Avoid writing and maintaining .epoch file
We now avoid writing .epoch files for increased flexibility and usability.
23765: Deprecate Swing beans package
We no longer need Swing libraries: these have long been replaced by JMX support.
112579: Fixed support for com.atomikos.icatch.enable_logging=false
Disabling transaction logging now works again.
112646: Enable backward compatibility of sessionTransacted behavior
Legacy applications/configurations that expect the 'old' behavior of our JMS sessions (determined by the sessionTransacted flag passed upon session creation) can now re-enable this behavior by setting the ignoreSessionTransactedFlag on the Atomikos connection factory to false.
112579: Property com.atomikos.icatch.enable_logging is ignored
This setting got ignored in the 3.9 release, meaning there was no way to turn logging off - this has now been fixed.
For now, this module is no longer compatible with the new logging/recovery and has been removed. Later on, we'll consider the equivalent for the new logging mechanism.
89208: Improved constructor for RemoteClientUserTransaction
Added a new constructor that accepts the ConfigProperties as parameter. This allows reuse of config parameters that are looked up by the core startup.
Available to customers only. Want to become a customer?