|
|||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Objectorg.springframework.transaction.support.AbstractPlatformTransactionManager
org.springframework.transaction.jta.JtaTransactionManager
PlatformTransactionManager implementation for JTA, i.e. J2EE container transactions. Can also work with a locally configured JTA implementation.
This transaction manager is appropriate for handling distributed transactions, i.e. transactions that span multiple resources, and for managing transactions on a J2EE Connector (e.g. a persistence toolkit registered as JCA Connector). For a single JDBC DataSource, DataSourceTransactionManager is perfectly sufficient, and for accessing a single resource with Hibernate (including transactional cache), HibernateTransactionManager is appropriate.
Transaction synchronization is active by default, to allow data access support classes to register resources that are opened within the transaction for closing at transaction completion time. Spring's support classes for JDBC, Hibernate and JDO all perform such registration, allowing for reuse of the same Hibernate Session etc within the transaction. Standard JTA does not even guarantee that for Connections from a transactional JDBC DataSource: Spring's synchronization solves those issues.
Synchronization is also leveraged for transactional cache handling with Hibernate. Therefore, as long as JtaTransactionManager drives the JTA transactions, there is no need to configure Hibernate's JTATransaction strategy or a container-specific Hibernate TransactionManagerLookup. However, certain JTA implementations are restrictive in terms of what JDBC calls they allow after transaction completion, complaining even on close calls: In that case, it is indeed necessary to configure a Hibernate TransactionManagerLookup; Spring will automatically adapt to this.
If JtaTransactionManager participates in an existing JTA transaction, e.g. from EJB CMT, synchronization will be triggered on finishing the nested transaction, before passing transaction control back to the J2EE container. In this case, a container-specific Hibernate TransactionManagerLookup is the only way to achieve exact afterCompletion callbacks for transactional cache handling with Hibernate. In such a scenario, use Hibernate >=2.1 which features automatic JTA detection.
Transaction suspension (REQUIRES_NEW, NOT_SUPPORTED) is just available with a JTA TransactionManager being registered, via the "transactionManagerName" or "transactionManager" property. The location of this internal JTA object is not specified by J2EE; it is individual for each J2EE server, often kept in JNDI like the UserTransaction. Some well-known JNDI locations are:
"java:comp/UserTransaction" as JNDI name for the TransactionManager means that the same JTA object implements both the UserTransaction and the TransactionManager interface. As this is easy to test when looking up the UserTransaction, this will be auto-detected on initialization of JtaTransactionManager. Thus, there's no need to specify the "transactionManagerName" in this case (for Resin, Orion, JOnAS).
For IBM WebSphere and standalone JOTM, static accessor methods are required to obtain the JTA TransactionManager: Therefore, WebSphere and JOTM have their own FactoryBean implementations, to be wired with the "transactionManager" property. In case of JotmFactoryBean, the same JTA object implements UserTransaction too: Therefore, passing the object to the "userTransaction" property is sufficient.
The internal JTA TransactionManager can also be used to register custom synchronizations with the JTA transaction itself instead of Spring's transaction manager. LocalSessionFactoryBean supports plugging a given TransactionManager into Hibernate's TransactionManagerLookup mechanism, for Hibernate-driven cache synchronization without double configuration.
JtaTransactionManager supports timeouts but not custom isolation levels. Custom subclasses can override applyIsolationLevel for specific JTA implementations. Note that some resource-specific transaction managers like DataSourceTransactionManager and HibernateTransactionManager do support timeouts, custom isolation levels, and transaction suspension without JTA's restrictions.
setUserTransactionName(java.lang.String)
,
setTransactionManagerName(java.lang.String)
,
applyIsolationLevel(int)
,
JotmFactoryBean
,
WebSphereTransactionManagerFactoryBean
,
LocalSessionFactoryBean.setJtaTransactionManager(javax.transaction.TransactionManager)
,
HibernateTransactionManager
,
DataSourceTransactionManager
Field Summary | |
static java.lang.String |
DEFAULT_USER_TRANSACTION_NAME
|
Fields inherited from class org.springframework.transaction.support.AbstractPlatformTransactionManager |
logger, SYNCHRONIZATION_ALWAYS, SYNCHRONIZATION_NEVER, SYNCHRONIZATION_ON_ACTUAL_TRANSACTION |
Constructor Summary | |
JtaTransactionManager()
|
Method Summary | |
void |
afterPropertiesSet()
Invoked by a BeanFactory after it has set all bean properties supplied (and satisfied BeanFactoryAware and ApplicationContextAware). |
protected void |
applyIsolationLevel(int isolationLevel)
Apply the given transaction isolation level. |
protected void |
doBegin(java.lang.Object transaction,
TransactionDefinition definition)
Begin a new transaction with the given transaction definition. |
protected void |
doCleanupAfterCompletion(java.lang.Object transaction)
Cleanup resources after transaction completion. |
protected void |
doCommit(DefaultTransactionStatus status)
Perform an actual commit on the given transaction. |
protected java.lang.Object |
doGetTransaction()
Return a current transaction object, i.e. |
protected void |
doResume(java.lang.Object transaction,
java.lang.Object suspendedResources)
Resume the resources of the current transaction. |
protected void |
doRollback(DefaultTransactionStatus status)
Perform an actual rollback on the given transaction. |
protected void |
doSetRollbackOnly(DefaultTransactionStatus status)
Set the given transaction rollback-only. |
protected java.lang.Object |
doSuspend(java.lang.Object transaction)
Suspend the resources of the current transaction. |
protected boolean |
isExistingTransaction(java.lang.Object transaction)
Check if the given transaction object indicates an existing, i.e. |
protected boolean |
isRollbackOnly(java.lang.Object transaction)
Check if the given transaction object indicates a rollback-only, assumably from a nested transaction (else, the TransactionStatus of this transaction would have indicated rollback-only). |
protected javax.transaction.TransactionManager |
lookupTransactionManager(java.lang.String transactionManagerName)
Look up the JTA TransactionManager in JNDI via the configured name. |
protected javax.transaction.UserTransaction |
lookupUserTransaction(java.lang.String userTransactionName)
Look up the JTA UserTransaction in JNDI via the configured name. |
void |
setJndiTemplate(JndiTemplate jndiTemplate)
Set the JndiTemplate to use for JNDI lookups. |
void |
setTransactionManager(javax.transaction.TransactionManager transactionManager)
Set the JTA TransactionManager to use as direct reference. |
void |
setTransactionManagerName(java.lang.String transactionManagerName)
Set the JNDI name of the JTA TransactionManager. |
void |
setUserTransaction(javax.transaction.UserTransaction userTransaction)
Set the JTA UserTransaction to use as direct reference. |
void |
setUserTransactionName(java.lang.String userTransactionName)
Set the JNDI name of the JTA UserTransaction. |
Methods inherited from class org.springframework.transaction.support.AbstractPlatformTransactionManager |
commit, getTransaction, getTransactionSynchronization, isRollbackOnCommitFailure, rollback, setRollbackOnCommitFailure, setTransactionSynchronization, setTransactionSynchronizationName |
Methods inherited from class java.lang.Object |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Field Detail |
public static final java.lang.String DEFAULT_USER_TRANSACTION_NAME
Constructor Detail |
public JtaTransactionManager()
Method Detail |
public void setJndiTemplate(JndiTemplate jndiTemplate)
public void setUserTransaction(javax.transaction.UserTransaction userTransaction)
public void setUserTransactionName(java.lang.String userTransactionName)
DEFAULT_USER_TRANSACTION_NAME
public void setTransactionManager(javax.transaction.TransactionManager transactionManager)
A TransactionManager is necessary for suspending and resuming transactions, as this not supported by the UserTransaction interface.
public void setTransactionManagerName(java.lang.String transactionManagerName)
A TransactionManager is necessary for suspending and resuming transactions, as this not supported by the UserTransaction interface.
public void afterPropertiesSet() throws CannotCreateTransactionException
InitializingBean
This method allows the bean instance to perform initialization only possible when all bean properties have been set and to throw an exception in the event of misconfiguration.
afterPropertiesSet
in interface InitializingBean
CannotCreateTransactionException
protected javax.transaction.UserTransaction lookupUserTransaction(java.lang.String userTransactionName) throws CannotCreateTransactionException
userTransactionName
- the JNDI name of the UserTransaction
CannotCreateTransactionException
- if the JNDI lookup failedsetJndiTemplate(org.springframework.jndi.JndiTemplate)
,
setUserTransactionName(java.lang.String)
protected javax.transaction.TransactionManager lookupTransactionManager(java.lang.String transactionManagerName) throws CannotCreateTransactionException
transactionManagerName
- the JNDI name of the TransactionManager
CannotCreateTransactionException
- if the JNDI lookup failedsetJndiTemplate(org.springframework.jndi.JndiTemplate)
,
setTransactionManagerName(java.lang.String)
protected java.lang.Object doGetTransaction()
AbstractPlatformTransactionManager
doGetTransaction
in class AbstractPlatformTransactionManager
protected boolean isExistingTransaction(java.lang.Object transaction)
AbstractPlatformTransactionManager
isExistingTransaction
in class AbstractPlatformTransactionManager
transaction
- transaction object returned by doGetTransaction
protected void doBegin(java.lang.Object transaction, TransactionDefinition definition)
AbstractPlatformTransactionManager
doBegin
in class AbstractPlatformTransactionManager
transaction
- transaction object returned by doGetTransactiondefinition
- TransactionDefinition instance, describing
propagation behavior, isolation level, timeout etc.protected void applyIsolationLevel(int isolationLevel) throws InvalidIsolationLevelException
isolationLevel
- isolation level taken from transaction definition
InvalidIsolationLevelException
- if the given isolation level
cannot be appliedprotected java.lang.Object doSuspend(java.lang.Object transaction)
AbstractPlatformTransactionManager
doSuspend
in class AbstractPlatformTransactionManager
transaction
- transaction object returned by doGetTransaction
AbstractPlatformTransactionManager.doResume(java.lang.Object, java.lang.Object)
protected void doResume(java.lang.Object transaction, java.lang.Object suspendedResources)
AbstractPlatformTransactionManager
doResume
in class AbstractPlatformTransactionManager
transaction
- transaction object returned by doGetTransactionsuspendedResources
- the object that holds suspended resources,
as returned by doSuspendAbstractPlatformTransactionManager.doSuspend(java.lang.Object)
protected boolean isRollbackOnly(java.lang.Object transaction) throws TransactionException
AbstractPlatformTransactionManager
isRollbackOnly
in class AbstractPlatformTransactionManager
transaction
- transaction object returned by doGetTransaction
TransactionException
- in case of creation or system errorsprotected void doCommit(DefaultTransactionStatus status)
AbstractPlatformTransactionManager
doCommit
in class AbstractPlatformTransactionManager
status
- status representation of the transactionprotected void doRollback(DefaultTransactionStatus status)
AbstractPlatformTransactionManager
doRollback
in class AbstractPlatformTransactionManager
status
- status representation of the transactionprotected void doSetRollbackOnly(DefaultTransactionStatus status)
AbstractPlatformTransactionManager
doSetRollbackOnly
in class AbstractPlatformTransactionManager
status
- status representation of the transactionprotected void doCleanupAfterCompletion(java.lang.Object transaction)
AbstractPlatformTransactionManager
doCleanupAfterCompletion
in class AbstractPlatformTransactionManager
transaction
- transaction object returned by doGetTransaction
|
|||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |