Save This Page
Home » spring-framework-2.5.6-with-dependencies » org.springframework » transaction » jta » [javadoc | source]
org.springframework.transaction.jta
public class: JtaTransactionManager [javadoc | source]
java.lang.Object
   org.springframework.transaction.support.AbstractPlatformTransactionManager
      org.springframework.transaction.jta.JtaTransactionManager

All Implemented Interfaces:
    Serializable, TransactionFactory, InitializingBean, PlatformTransactionManager

Direct Known Subclasses:
    WebLogicJtaTransactionManager, OC4JJtaTransactionManager, WebSphereUowTransactionManager

org.springframework.transaction.PlatformTransactionManager implementation for JTA, delegating to a backend JTA provider. This is typically used to delegate to a J2EE server's transaction coordinator, but may also be configured with a local JTA provider which is embedded within the application.

This transaction manager is appropriate for handling distributed transactions, i.e. transactions that span multiple resources, and for controlling transactions on application server resources (e.g. JDBC DataSources available in JNDI) in general. For a single JDBC DataSource, DataSourceTransactionManager is perfectly sufficient, and for accessing a single resource with Hibernate (including transactional cache), HibernateTransactionManager is appropriate, for example.

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, JDO etc 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.

For typical JTA transactions (REQUIRED, SUPPORTS, MANDATORY, NEVER), a plain JtaTransactionManager definition is all you need, completely portable across all J2EE servers. This corresponds to the functionality of the JTA UserTransaction, for which J2EE specifies a standard JNDI name ("java:comp/UserTransaction"). There is no need to configure a server-specific TransactionManager lookup for this kind of JTA usage.

Note: Advanced JTA usage below. Dealing with these mechanisms is not necessary for typical usage scenarios.

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 well-defined JTA object is not specified by J2EE; it is specific to each J2EE server, often kept in JNDI like the JTA UserTransaction. Some well-known JNDI locations are:

All of these cases are autodetected by JtaTransactionManager, provided that the "autodetectTransactionManager" flag is set to "true" (which it is by default).

Note: Support for the JTA TransactionManager interface is not required by J2EE. Almost all J2EE servers expose it, but do so as extension to J2EE. There might be some issues with compatibility, despite the TransactionManager interface being part of JTA. As a consequence, Spring provides various vendor-specific PlatformTransactionManagers, which are recommended to be used if appropriate: WebLogicJtaTransactionManager , WebSphereUowTransactionManager and OC4JJtaTransactionManager . For all other J2EE servers, the standard JtaTransactionManager is sufficient.

Consider using Spring 2.5's tx:jta-transaction-manager configuration element for automatically picking the appropriate JTA platform transaction manager (automatically detecting WebLogic, WebSphere and OC4J).

This pure JtaTransactionManager supports timeouts but not per-transaction isolation levels. Custom subclasses may override #doJtaBegin for specific JTA extensions in order to provide this functionality; Spring includes corresponding WebLogicJtaTransactionManager and OC4JJtaTransactionManager classes, for BEA's WebLogic Server and Oracle's OC4J, respectively. Such adapters for specific J2EE transaction coordinators may also expose transaction names for monitoring; with standard JTA, transaction names will simply be ignored.

JTA 1.1 adds the TransactionSynchronizationRegistry facility, as public Java EE 5 API in addition to the standard JTA UserTransaction handle. As of Spring 2.5, this JtaTransactionManager autodetects the TransactionSynchronizationRegistry and uses it for registering Spring-managed synchronizations when participating in an existing JTA transaction (e.g. controlled by EJB CMT). If no TransactionSynchronizationRegistry is available (or the JTA 1.1 API isn't available), then such synchronizations will be registered via the (non-J2EE) JTA TransactionManager handle.

This class is serializable. However, active synchronizations do not survive serialization.

Field Summary
public static final  String DEFAULT_USER_TRANSACTION_NAME    Default JNDI location for the JTA UserTransaction. Many J2EE servers also provide support for the JTA TransactionManager interface there. 
public static final  String[] FALLBACK_TRANSACTION_MANAGER_NAMES    Fallback JNDI locations for the JTA TransactionManager. Applied if the JTA UserTransaction does not implement the JTA TransactionManager interface, provided that the "autodetectTransactionManager" flag is "true". 
public static final  String DEFAULT_TRANSACTION_SYNCHRONIZATION_REGISTRY_NAME    Standard Java EE 5 JNDI location for the JTA TransactionSynchronizationRegistry. Autodetected when available. 
Fields inherited from org.springframework.transaction.support.AbstractPlatformTransactionManager:
SYNCHRONIZATION_ALWAYS,  SYNCHRONIZATION_ON_ACTUAL_TRANSACTION,  SYNCHRONIZATION_NEVER,  logger
Constructor:
 public JtaTransactionManager() 
 public JtaTransactionManager(UserTransaction userTransaction) 
    Create a new JtaTransactionManager instance.
    Parameters:
    userTransaction - the JTA UserTransaction to use as direct reference
 public JtaTransactionManager(TransactionManager transactionManager) 
    Create a new JtaTransactionManager instance.
    Parameters:
    transactionManager - the JTA TransactionManager to use as direct reference
 public JtaTransactionManager(UserTransaction userTransaction,
    TransactionManager transactionManager) 
    Create a new JtaTransactionManager instance.
    Parameters:
    userTransaction - the JTA UserTransaction to use as direct reference
    transactionManager - the JTA TransactionManager to use as direct reference
Method from org.springframework.transaction.jta.JtaTransactionManager Summary:
afterPropertiesSet,   applyIsolationLevel,   applyTimeout,   buildUserTransaction,   checkUserTransactionAndTransactionManager,   createTransaction,   doBegin,   doCommit,   doGetJtaTransaction,   doGetTransaction,   doJtaBegin,   doJtaResume,   doJtaSuspend,   doRegisterAfterCompletionWithJtaTransaction,   doResume,   doRollback,   doSetRollbackOnly,   doSuspend,   findTransactionManager,   findTransactionSynchronizationRegistry,   findUserTransaction,   getJndiEnvironment,   getJndiTemplate,   getTransactionManager,   getUserTransaction,   initTransactionSynchronizationRegistry,   initUserTransactionAndTransactionManager,   isExistingTransaction,   lookupTransactionManager,   lookupTransactionSynchronizationRegistry,   lookupUserTransaction,   registerAfterCompletionWithExistingTransaction,   retrieveTransactionManager,   retrieveTransactionSynchronizationRegistry,   retrieveUserTransaction,   setAllowCustomIsolationLevels,   setAutodetectTransactionManager,   setAutodetectUserTransaction,   setCacheUserTransaction,   setJndiEnvironment,   setJndiTemplate,   setTransactionManager,   setTransactionManagerName,   setTransactionSynchronizationRegistryName,   setUserTransaction,   setUserTransactionName,   shouldCommitOnGlobalRollbackOnly,   useSavepointForNestedTransaction
Methods from org.springframework.transaction.support.AbstractPlatformTransactionManager:
commit,   determineTimeout,   doBegin,   doCleanupAfterCompletion,   doCommit,   doGetTransaction,   doResume,   doRollback,   doSetRollbackOnly,   doSuspend,   getDefaultTimeout,   getTransaction,   getTransactionSynchronization,   invokeAfterCompletion,   isExistingTransaction,   isFailEarlyOnGlobalRollbackOnly,   isGlobalRollbackOnParticipationFailure,   isNestedTransactionAllowed,   isRollbackOnCommitFailure,   isValidateExistingTransaction,   newTransactionStatus,   prepareForCommit,   registerAfterCompletionWithExistingTransaction,   resume,   rollback,   setDefaultTimeout,   setFailEarlyOnGlobalRollbackOnly,   setGlobalRollbackOnParticipationFailure,   setNestedTransactionAllowed,   setRollbackOnCommitFailure,   setTransactionSynchronization,   setTransactionSynchronizationName,   setValidateExistingTransaction,   shouldCommitOnGlobalRollbackOnly,   suspend,   triggerBeforeCommit,   triggerBeforeCompletion,   useSavepointForNestedTransaction
Methods from java.lang.Object:
equals,   getClass,   hashCode,   notify,   notifyAll,   toString,   wait,   wait,   wait
Method from org.springframework.transaction.jta.JtaTransactionManager Detail:
 public  void afterPropertiesSet() throws TransactionSystemException 
    Initialize the UserTransaction as well as the TransactionManager handle.
 protected  void applyIsolationLevel(JtaTransactionObject txObject,
    int isolationLevel) throws SystemException, InvalidIsolationLevelException 
    Apply the given transaction isolation level. The default implementation will throw an exception for any level other than ISOLATION_DEFAULT.

    To be overridden in subclasses for specific JTA implementations, as alternative to overriding the full #doJtaBegin method.

 protected  void applyTimeout(JtaTransactionObject txObject,
    int timeout) throws SystemException 
    Apply the given transaction timeout. The default implementation will call UserTransaction.setTransactionTimeout for a non-default timeout value.
 protected UserTransaction buildUserTransaction(TransactionManager transactionManager) 
    Build a UserTransaction handle based on the given TransactionManager.
 protected  void checkUserTransactionAndTransactionManager() throws IllegalStateException 
    Check the UserTransaction as well as the TransactionManager handle, assuming standard JTA requirements.
 public Transaction createTransaction(String name,
    int timeout) throws SystemException, NotSupportedException 
 protected  void doBegin(Object transaction,
    TransactionDefinition definition) 
 protected  void doCommit(DefaultTransactionStatus status) 
 protected JtaTransactionObject doGetJtaTransaction(UserTransaction ut) 
    Get a JTA transaction object for the given current UserTransaction.

    Subclasses can override this to provide a JtaTransactionObject subclass, for example holding some additional JTA handle needed.

 protected Object doGetTransaction() 
    This implementation returns a JtaTransactionObject instance for the JTA UserTransaction.

    The UserTransaction object will either be looked up freshly for the current transaction, or the cached one looked up at startup will be used. The latter is the default: Most application servers use a shared singleton UserTransaction that can be cached. Turn off the "cacheUserTransaction" flag to enforce a fresh lookup for every transaction.

 protected  void doJtaBegin(JtaTransactionObject txObject,
    TransactionDefinition definition) throws SystemException, NotSupportedException 
    Perform a JTA begin on the JTA UserTransaction or TransactionManager.

    This implementation only supports standard JTA functionality: that is, no per-transaction isolation levels and no transaction names. Can be overridden in subclasses, for specific JTA implementations.

    Calls applyIsolationLevel and applyTimeout before invoking the UserTransaction's begin method.

 protected  void doJtaResume(JtaTransactionObject txObject,
    Object suspendedTransaction) throws SystemException, InvalidTransactionException 
    Perform a JTA resume on the JTA TransactionManager.

    Can be overridden in subclasses, for specific JTA implementations.

 protected Object doJtaSuspend(JtaTransactionObject txObject) throws SystemException 
    Perform a JTA suspend on the JTA TransactionManager.

    Can be overridden in subclasses, for specific JTA implementations.

 protected  void doRegisterAfterCompletionWithJtaTransaction(JtaTransactionObject txObject,
    List synchronizations) throws SystemException, RollbackException 
    Register a JTA synchronization on the JTA TransactionManager, for calling afterCompletion on the given Spring TransactionSynchronizations.

    The default implementation registers the synchronizations on the JTA 1.1 TransactionSynchronizationRegistry, if available, or on the JTA TransactionManager's current Transaction - again, if available. If none of the two is available, a warning will be logged.

    Can be overridden in subclasses, for specific JTA implementations.

 protected  void doResume(Object transaction,
    Object suspendedResources) 
 protected  void doRollback(DefaultTransactionStatus status) 
 protected  void doSetRollbackOnly(DefaultTransactionStatus status) 
 protected Object doSuspend(Object transaction) 
 protected TransactionManager findTransactionManager(UserTransaction ut) 
    Find the JTA TransactionManager through autodetection: checking whether the UserTransaction object implements the TransactionManager, and checking the fallback JNDI locations.
 protected Object findTransactionSynchronizationRegistry(UserTransaction ut,
    TransactionManager tm) throws TransactionSystemException 
    Find the JTA 1.1 TransactionSynchronizationRegistry through autodetection: checking whether the UserTransaction object or TransactionManager object implements it, and checking Java EE 5's standard JNDI location.

    The default implementation simply returns null.

 protected UserTransaction findUserTransaction() 
    Find the JTA UserTransaction through a default JNDI lookup: "java:comp/UserTransaction".
 public Properties getJndiEnvironment() 
    Return the JNDI environment to use for JNDI lookups.
 public JndiTemplate getJndiTemplate() 
    Return the JndiTemplate used for JNDI lookups.
 public TransactionManager getTransactionManager() 
    Return the JTA TransactionManager that this transaction manager uses.
 public UserTransaction getUserTransaction() 
    Return the JTA UserTransaction that this transaction manager uses.
 protected  void initTransactionSynchronizationRegistry() 
 protected  void initUserTransactionAndTransactionManager() throws TransactionSystemException 
    Initialize the UserTransaction as well as the TransactionManager handle.
 protected boolean isExistingTransaction(Object transaction) 
 protected TransactionManager lookupTransactionManager(String transactionManagerName) throws TransactionSystemException 
    Look up the JTA TransactionManager in JNDI via the configured name.

    Called by afterPropertiesSet if no direct TransactionManager reference was set. Can be overridden in subclasses to provide a different TransactionManager object.

 protected Object lookupTransactionSynchronizationRegistry(String registryName) throws TransactionSystemException 
    Look up the JTA 1.1 TransactionSynchronizationRegistry in JNDI via the configured name.

    Can be overridden in subclasses to provide a different TransactionManager object.

 protected UserTransaction lookupUserTransaction(String userTransactionName) throws TransactionSystemException 
    Look up the JTA UserTransaction in JNDI via the configured name.

    Called by afterPropertiesSet if no direct UserTransaction reference was set. Can be overridden in subclasses to provide a different UserTransaction object.

 protected  void registerAfterCompletionWithExistingTransaction(Object transaction,
    List synchronizations) 
 protected TransactionManager retrieveTransactionManager() throws TransactionSystemException 
    Allows subclasses to retrieve the JTA TransactionManager in a vendor-specific manner. Only called if no "transactionManager" or "transactionManagerName" specified.

    The default implementation simply returns null.

 protected Object retrieveTransactionSynchronizationRegistry() throws TransactionSystemException 
    Allows subclasses to retrieve the JTA 1.1 TransactionSynchronizationRegistry in a vendor-specific manner.

    The default implementation simply returns null.

 protected UserTransaction retrieveUserTransaction() throws TransactionSystemException 
    Allows subclasses to retrieve the JTA UserTransaction in a vendor-specific manner. Only called if no "userTransaction" or "userTransactionName" specified.

    The default implementation simply returns null.

 public  void setAllowCustomIsolationLevels(boolean allowCustomIsolationLevels) 
    Set whether to allow custom isolation levels to be specified.

    Default is "false", throwing an exception if a non-default isolation level is specified for a transaction. Turn this flag on if affected resource adapters check the thread-bound transaction context and apply the specified isolation levels individually (e.g. through a IsolationLevelDataSourceRouter).

 public  void setAutodetectTransactionManager(boolean autodetectTransactionManager) 
    Set whether to autodetect a JTA UserTransaction object that implements the JTA TransactionManager interface too (i.e. the JNDI location for the TransactionManager is "java:comp/UserTransaction", same as for the UserTransaction). Also checks the fallback JNDI locations "java:comp/TransactionManager" and "java:/TransactionManager". Will proceed without TransactionManager if none found.

    Default is "true", autodetecting the TransactionManager unless it has been specified explicitly. Can be turned off to deliberately ignore an available TransactionManager, for example when there are known issues with suspend/resume and any attempt to use REQUIRES_NEW or NOT_SUPPORTED should fail fast.

 public  void setAutodetectUserTransaction(boolean autodetectUserTransaction) 
    Set whether to autodetect the JTA UserTransaction at its default JNDI location "java:comp/UserTransaction", as specified by J2EE. Will proceed without UserTransaction if none found.

    Default is "true", autodetecting the UserTransaction unless it has been specified explicitly. Turn this flag off to allow for JtaTransactionManager operating against the TransactionManager only, despite a default UserTransaction being available.

 public  void setCacheUserTransaction(boolean cacheUserTransaction) 
    Set whether to cache the JTA UserTransaction object fetched from JNDI.

    Default is "true": UserTransaction lookup will only happen at startup, reusing the same UserTransaction handle for all transactions of all threads. This is the most efficient choice for all application servers that provide a shared UserTransaction object (the typical case).

    Turn this flag off to enforce a fresh lookup of the UserTransaction for every transaction. This is only necessary for application servers that return a new UserTransaction for every transaction, keeping state tied to the UserTransaction object itself rather than the current thread.

 public  void setJndiEnvironment(Properties jndiEnvironment) 
    Set the JNDI environment to use for JNDI lookups. Creates a JndiTemplate with the given environment settings.
 public  void setJndiTemplate(JndiTemplate jndiTemplate) 
    Set the JndiTemplate to use for JNDI lookups. A default one is used if not set.
 public  void setTransactionManager(TransactionManager transactionManager) 
    Set the JTA TransactionManager to use as direct reference.

    A TransactionManager is necessary for suspending and resuming transactions, as this not supported by the UserTransaction interface.

    Note that the TransactionManager will be autodetected if the JTA UserTransaction object implements the JTA TransactionManager interface too, as well as autodetected at various well-known fallback JNDI locations.

 public  void setTransactionManagerName(String transactionManagerName) 
    Set the JNDI name of the JTA TransactionManager.

    A TransactionManager is necessary for suspending and resuming transactions, as this not supported by the UserTransaction interface.

    Note that the TransactionManager will be autodetected if the JTA UserTransaction object implements the JTA TransactionManager interface too, as well as autodetected at various well-known fallback JNDI locations.

 public  void setTransactionSynchronizationRegistryName(String transactionSynchronizationRegistryName) 
    Set the JNDI name of the JTA 1.1 TransactionSynchronizationRegistry.

    Note that the TransactionSynchronizationRegistry will be autodetected at the Java EE 5 default location "java:comp/TransactionSynchronizationRegistry" if not specified explicitly.

 public  void setUserTransaction(UserTransaction userTransaction) 
    Set the JTA UserTransaction to use as direct reference.

    Typically just used for local JTA setups; in a J2EE environment, the UserTransaction will always be fetched from JNDI.

 public  void setUserTransactionName(String userTransactionName) 
    Set the JNDI name of the JTA UserTransaction.

    Note that the UserTransaction will be autodetected at the J2EE default location "java:comp/UserTransaction" if not specified explicitly.

 protected boolean shouldCommitOnGlobalRollbackOnly() 
    This implementation returns "true": a JTA commit will properly handle transactions that have been marked rollback-only at a global level.
 protected boolean useSavepointForNestedTransaction() 
    This implementation returns false to cause a further invocation of doBegin despite an already existing transaction.

    JTA implementations might support nested transactions via further UserTransaction.begin() invocations, but never support savepoints.