JTX concepts
JTX is all about: resources, resource managers, transactions and transaction managers.
Resources and Resource managers
Resource in JTX is anything that have transactions. Speaking programatically, resource is any class than encapsulates some transactional entity, for example: database session (for databases), messages manager (for message queues). Resource knows how to maintain a transaction.
Each resource (i.e. resource type) has its own resource manager. In
JTX, resource manager is responsible for managing transactions of the
resources of the same type. As seen in the code, JtxResourceManager
interface is fairly simple, two most important methods are
beginTransaction()
and rollbackTransaction()
.
We can say that JtxResourceManager
serves as an adapter between
JTX framework and some transactional resource. For e.g. database that
would be an implementation that takes database session (or connection)
and creates a new transaction on it. Since it is an adapter, beginning
and rolling back the transactions can be now done through resource
manager, without touching the resource itself.
Transaction manager
Transaction manager goes one step further. It's purpose is to control
all registered resource managers and to create/close transactions on all
acquired resources. JTX transaction manager also provides out-of-box
transaction propagation handling. Let's see more details of
JtxTransactionManager
.
As said, JTX transaction manager is used to start transactions. Actually, when needed transactions are requested from the JTX manager. Depending on transaction propagation, manager will return an existing transaction or a new one.
Requested transactions may be optionally scoped by context in which they exists. Only one transaction may be opened in the context. For example, context can be a class within the transactions are created, so only the first method of that class will create the transaction; if that method internally invoke other (transactional) methods, their requests will be ignored.
Transaction
Transaction is an unit of work that is performed by one or more
resources. Great definition, huh:)? In JTX, transactions are
encapsulated by JtxTransaction
class. The most important thing to
remember about it is that:
JtxTransaction
is a 'transactional request'. Its existence
doesn't mean that real transaction is started on the resources(s).
We said that JtxTransactions
are requested from the
JtxTransactionManager
. But only when a resource is requested from
the jtx transaction, a real transaction is started on the resource!
JTX supports several different resource types, i.e. a transaction can be started over several resources. When committed, a real transaction is committed on each resource, one by one. We are aware this is not the ideal scenario for transactions over multiple resources, but it is pragmatic; on the other hand JTX is usually used in one-resource-type environment, where the only resource is database.
Transaction status
JTX transaction goes through several statuses during it's usage; they
are very similar to JTA. On the very beginning, status is either
ACTIVE
or NO_TRANSACTION
. As said, JTX transaction is an actual
transaction request, therefore even if a real transaction is not
required - e.g. as defined by propagation, there will be a
JtxTransaction
object in state NO_TRANSACTION
.
Other statuses are self-explanatory and can be seen in javadoc or source.
Transaction mode
Following attributes defines transaction mode.
Propagation behavior
Propagation behavior is used to define the transaction boundaries. It defines behavior if a transactional method is executed when a transaction context already exists.
JTX provides its own propagation management.
Isolation level
Isolation level has something to do with the concurrency control. When multiple transactions are running they may cause dirty reads, non repeatable reads and phantom reads. It is the degree of isolation one transaction has from the work of other transactions. For example, can this transaction see uncommitted writes from other transactions?
Isolation level is currently not supported by JTX. It is expected to be managed by transactional resource itself.
Timeout
Defines how long this transaction may run before timing out. Currently, JTX only checks the length of the transaction; longer transaction will not be canceled after timeout period.
readOnlyMode
Read-only transaction does not modify any data. Transaction should fail on write attempt. JTX does not treat this flag, it just passes it to the resource manager i.e. resource.
Propagation behavior management
One very important feature provided by JtxTransactionManager
is
propagation behavior management. This means that manager will handle
transaction propagation as defined by transaction mode attribute.
Following propagations are supported by JTX:
PROPAGATION_REQUIRED
- Support a current transaction, create a new one if none exists;PROPAGATION_SUPPORTS
- Support a current transaction, execute non-transactionally if none exists;PROPAGATION_MANDATORY
- Support a current transaction, throw an exception if none exists;PROPAGATION_REQUIRES_NEW
- Create a new transaction, suspend the current transaction if one exists;PROPAGATION_NOT_SUPPORTED
- Execute non-transactionally, suspend the current transaction if one exists;PROPAGATION_NEVER
- Execute non-transactionally, throw an exception if a transaction exists.