blob: b37138c2532515584a70e4c32877de68fee310ab [file] [log] [blame]
= Aries Transaction Control Service
== OSGi Transaction Control Service
This set of modules is an implementation of the proposed OSGi Transaction Control Service and related services, such as JDBC and JPA resource providers.
The Transaction Control Service (RFC-221) is an in-progress RFC publicly available from the OSGi Alliance: https://github.com/osgi/design/blob/master/rfcs/rfc0221/rfc-0221-TransactionControl.pdf
Given that the RFC is non-final the OSGi API declared in this project is subject to change at any time up to its official release.
Also the behaviour of this implementation may not always be up-to-date with the latest wording in the RFC.
The project maintainers will, however try to keep pace with the RFC, and to ensure that the implementations are compliant with any OSGi specifications that result from the RFC.
== Getting started
The current released version of Transaction Control is 0.0.1, and it is available in https://mvnrepository.com/artifact/org.apache.aries.tx-control[Maven Central]
If you're new to the Transaction Control service then we recommend that you read the xref:modules/tx-control/quickstart.adoc[quickstart documentation first].
More detailed documentation is available in the xref:modules/tx-control/index.adoc[Aries Transaction Control Project]
== Why use the Transaction Control service?
Simply put the Transaction Control service makes resource access easy!
There's no need to worry about transaction lifecycle or closing connections, and there's built in support for useful features like connection pooling.
In addition to being simple the Transaction Control service also makes transaction management explicit.
As a result it is easier to follow the transactions flowing throughout your code, and it protects you from the xref:modules/tx-control/spring-tx.adoc[proxy problem] that declarative transaction strategies often suffer from.
== Modules
The following modules are available for use in OSGi
. xref:modules/tx-control/localTransactions.adoc[tx-control-service-local] :- A purely local transaction control service implementation.
This can be used with any resource-local capable ResourceProvider
. xref:modules/tx-control/xaTransactions.adoc[tx-control-service-xa] :- An XA-capable transaction control service implementation based on the Geronimo Transaction Manager.
This can be used with XA capable resources, or with local resources.
Local resources will make use of the last-participant gambit.
. xref:modules/tx-control/localJDBC.adoc[tx-control-provider-jdbc-local] :- A JDBC resource provider that provides connection pooling and that can integrate with local transactions.
The JDBCConnectionProviderFactory service may be used directly, or a service may be configured using the _org.apache.aries.tx.control.jdbc.local_ pid
. xref:modules/tx-control/xaJDBC.adoc[tx-control-provider-jdbc-xa] :- A JDBC resource provider that provides connection pooling and that can integrate with local or XA transactions.
The JDBCConnectionProviderFactory service may be used directly, or a service may be configured using the _org.apache.aries.tx.control.jdbc.xa_ pid
. xref:modules/tx-control/localJPA.adoc[tx-control-provider-jpa-local] :- A JPA resource provider that can integrate with local transactions.
The JPAEntityManagerProviderFactory service may be used directly, or a service may be configured using the _org.apache.aries.tx.control.jpa.local_ pid.
The implementation can also provide connection pooling if required
. xref:modules/tx-control/xaJPA.adoc[tx-control-provider-jpa-xa] :- A JDBC resource provider that integrates with XA transactions.
The JPAEntityManagerProviderFactory service may be used directly, or a service may be configured using the _org.apache.aries.tx.control.jpa.xa_ pid.
The implementation can also provide connection pooling if required
=== Which modules should I use?
If you wish to use entirely lightweight, resource-local transactions then it is best to pair the tx-control-service-local and tx-control-provider-jdbc-local or tx-control-provider-jpa-local bundles.
This will give transactional behaviour, but the result is _not guaranteed to be ACID if more than one resource is used_.
If ACID behaviour is needed across multiple resources then the tx-control-service-xa _must_ be used.
This service also provides an XA enabled two-phase commit algorithm, and also allows for ACID behaviour when _one_ of the resources only supports local transactions by using the last participant gambit.
When using the XA Transaction control service then the tx-control-provider-jdbc-xa or tx-control-provider-jpa-xa resource provider bundles should be used.
*IT IS NOT RECOMMENDED* to use both tx-control-service-xa and tx-control-service-local at the same time.
This will be confusing, and may lead to problems if different parts of the application bind to different service implementations.
*NOTE:* There is also no reason to use the tx-control-provider-jdbc-local in addition to the tx-control-provider-jdbc-xa service.
Using both together is not typically harmful, however the tx-control-provider-jdbc-xa bundle supports all of the same features as the tx-control-provider-jdbc-local bundle.
The same is *not* true of the JPA provider implementations.
== Pre-release APIs
As part of the Aries Transaction Control implementations pre-release versions of the OSGi Transaction Control API are provided.
Rather than putting the API into the wrong package namespace, or outputting them at the wrong version, they will be exported with a mandatory attribute of `api.status=aries.prerelease`.
By setting this attribute on their API imports users accept that the API may change without a change to the package version(s).
These changes may, or may not, be binary compatible.
Once the specification is final the attribute will be removed from the export.