The LogCloud is a cloud-enabled transaction logging and recovery service so your cloud application nodes themselves do not need any persistent storage. All transaction logging and recovery is taken care of by the LogCloud, so application nodes can come and go without affecting transaction recovery.
This enables truly elastic OLTP in the cloud, with the recovery service in the background - taking care of cleaning up any pending transactions.
Self-healing characteristics eliminate almost every need for administration. It was never easier to do distributed transactions!
A typical LogCloud deployment is shown in the figure below. Note that LogCloud is not a single actor but rather an emergent characteristic of a particular configuration based on a shared DBMS for transaction logs.
Error: image not foundLet's discuss the important actors and how they collaborate:
One or more transactional application nodes use the LogCloud DBMS for maintaining (and recovering) their transaction logs, because in cloud environments application-level disk access may not be available.
Embedded inside each application node is a recovery component that connects to the shared DBMS to access the transaction logs. A master election process ensures that this works without overloading everything: only one active node will do the recovery. As long as at least one node of your application cluster is online, recovery will work.
The backend resources used by the application nodes are the ones that need to be recovered by the LogCloud. So it's logical that the LogCloud needs access to those. This is trivially ensured by the recovery running inside each application node: it can access all the resource configurations that the application uses.
Most of the instructions below are done automatically if you run the example (also check its configuration files).
Make sure to setup this user account on your DBMS server first! The account also needs creation rights for tables and indexes (unless you want to setup the tables yourself first - not recommended).
Note: this is done automatically in the Spring Boot example (via Spring Boot startup config files).
Each application node must be configured to log to the LogCloud instance, by doing all of the following:
The LogCloud automatically recovers all application resources configured for XA.
Beware when you delete a resource from your application's config: you should only do so if you are sure that there are no pending (prepared) XIDs in the resource. The easiest way of ensuring this is by letting each node do a clean shutdown.
If you use transactions-remoting (transactions over REST) then you must also add the transactions-remoting-recovery jar to your classpath. This will enable HTTP recovery.
The recovery service needs the drivers to connect to each XA backend. By default, the recovery service has the following drivers in its classpath:
We reuse the driver versions from Spring Boot - so the concrete version will depend on what Spring Boot version used.
Note: in principle, any JDBC datasource can be used (including Oracle).
*Prerequisite: this feature requires DDL to be applied to the LogCloud database before it does anything.* Atomikos never creates or alters tables in your LogCloud database automatically - a DBA must run the following DDL first:
CREATE TABLE RECOVERY_ACTION_LOG (
OWNING_RECOVERY_DOMAIN_NAME VARCHAR(45) NOT NULL,
COORDINATOR_ID VARCHAR(36) NOT NULL,
XID VARCHAR(2000) NOT NULL,
ACTIVE_JVM_ID VARCHAR(2000) NOT NULL,
ACTION VARCHAR(20) NOT NULL,
DECISION_TIME BIGINT NOT NULL,
ID VARCHAR(36) NOT NULL
);
CREATE TABLE RECOVERY_HEURISTIC_LOG (
OWNING_RECOVERY_DOMAIN_NAME VARCHAR(45) NOT NULL,
COORDINATOR_ID VARCHAR(36) NOT NULL,
XID VARCHAR(2000) NOT NULL,
ACTIVE_JVM_ID VARCHAR(2000) NOT NULL,
OUTCOME VARCHAR(20) NOT NULL,
DECISION_TIME BIGINT NOT NULL
);
Until both tables exist (with the ID column on RECOVERY_ACTION_LOG -
older deployments that already created this table before this feature
shipped must add that column), recovery action logging silently stays
disabled: nothing is written, and nothing is logged or reported to say why.
This is deliberate - the feature only activates once its own schema is
present - but it does mean a missing/incomplete DDL run produces no visible
error on the write side. See the DB viewer section below for what happens
on the read side if the DDL is missing.
When recovery resolves an in-doubt transaction branch against a resource, it either replays the original commit decision or presumes abort, depending on whether a durable commit record was found. In a LogCloud deployment, every such decision is additionally recorded in two dedicated tables in the shared LogCloud database, so that a split between branches of the same transaction can be spotted after the fact:
PRESUMED_ABORT or REPLAY_COMMIT decision recovery makes for a coordinator/xid/JVM/action combination. Capped at 3 rows per key (append-only otherwise).
HEUR_ABORTED) reported for a coordinator/xid/JVM combination.
These tables are informational only: they do not participate in recovery decisions, they exist purely so an operator can later reconstruct what happened to a given coordinator.
Because both tables are append-only, LogCloud runs a daily sweep that removes rows older than a configurable retention window:
com.atomikos.icatch.logcloud_recovery_action_log_retention_days=90
0 or a negative value to disable the sweep entirely (rows accumulate indefinitely).
RECOVERY_ACTION_LOG and RECOVERY_HEURISTIC_LOG are only removed once both tables' activity for that key is older than the retention window — so a row is never deleted while a still-recent row for the same coordinator/xid/JVM exists in the other table.
transactions-logcloud-portal) that exposes a read-only view over the
LogCloud tables described above. Today it ships with a single screen:
Recovery actions.
RECOVERY_ACTION_LOG, newest first:
decision time, coordinator, xid, active JVM id, and the action taken
(PRESUMED_ABORT or REPLAY_COMMIT). Use "Load more" to page through older
rows, or the search box / action filter chips to narrow down to a specific
coordinator, xid, or action type.
RECOVERY_ACTION_LOG does not exist yet, the Recovery actions screen
shows a message in place of the table explaining that recovery action
logging is not enabled and linking back to this page for the schema -
it does not silently show an empty table, and it does not fail with a raw
error either.
transactions-logcloud-portal-VERSION.jar as part of your Atomikos
ExtremeTransactions subscription. Run it, pointing it at the same
LogCloud datasource as the rest of your LogCloud-enabled nodes - there is
no default, so it fails fast on startup if these are not set:
java -jar transactions-logcloud-portal-VERSION.jar \ --spring.datasource.url=jdbc:VENDOR://HOST:PORT/DATABASE \ --spring.datasource.username=USERNAME \ --spring.datasource.password=PASSWORD \ --spring.datasource.driver-class-name=VENDOR_JDBC_DRIVER_CLASSOnce started, open it in a browser at the printed port (default
8080,
override with --server.port). It has no authentication of its own — put
it behind whatever access control your deployment already uses for internal
operational tools.
The underlying GET /recovery-actions endpoint returns plain,
self-describing JSON, so it can just as easily be queried directly -
including by an AI coding agent using ordinary HTTP tooling - without going
through the browser UI.
Try it for yourself by taking our free trial:
Free Trial