XA transactions
XA is a two-phase commit protocol that is natively supported by many databases and transaction monitors. XA transactions allow multiple resources (such as other databases or JMS systems) to coordinate in a single global transaction. This ensures data credibility as updates are committed or rolled-back across all resources.
Some drivers don't natively support XA
For the drivers that don't support XA natively, TORO Integrate emulates XA via implementing last resource commit optimization; but such a strategy has limitations – it is not possible to have more than one emulation of an XA datasource in a single XA transaction.
Not all databases support XA natively.
Managing XA transactions
Before handling XA transactions, ensure that your database connection pool has the XA Transaction
option enabled.
Starting XA transactions
To mark the start of the transaction, call [SqlMethods.startTransaction(boolean, int, GloopExecutionContext)
]
[javadoc-io-toro-integrate-SqlMethods-startTransaction].
Parameter | Index | Default | Description |
---|---|---|---|
autoCommit |
0 | false |
Whether to automtically commit after the service has finished or not, even if an exception was thrown. |
timeout |
1 | 60 |
Amount of time to wait before timing out the transaction (in seconds). |
context |
2 | null |
First you must create a TransactionFacade
object first and then invoke its start()
method. To create said object,
you may use the Transactions
class's create
* methods.
1 2 | def transaction = Transactions.create(name, propagationBehavior, timeout) transaction.start() |
Committing XA transactions
To manually commit a transaction, call
SqlMethods.commitTransaction()
. This will commit the current
transaction.
As for committing an XA Transaction in Groovy, simply call on the TransactionFacade
object's commit()
method.
1 | transaction.commit() |
Rolling back XA transactions
As for rolling back, simply call
SqlMethods.rollbackTransaction()
. This will rollback the
current transaction.
To rollback an XA transaction in Groovy, simply call the rollback()
method of the TransactionFacade
object.
1 | transaction.rollback() |