org.springframework.transaction.jta
Class OC4JJtaTransactionManager

java.lang.Object
  extended by org.springframework.transaction.support.AbstractPlatformTransactionManager
      extended by org.springframework.transaction.jta.JtaTransactionManager
          extended by org.springframework.transaction.jta.OC4JJtaTransactionManager
All Implemented Interfaces:
java.io.Serializable, InitializingBean, TransactionFactory, PlatformTransactionManager

public class OC4JJtaTransactionManager
extends JtaTransactionManager

Special JtaTransactionManager variant for Oracle OC4J (10.1.3 and higher). Supports the full power of Spring's transaction definitions on OC4J's transaction coordinator, beyond standard JTA: transaction names and per-transaction isolation levels.

Uses OC4J's special begin(name) method to start a JTA transaction, in orderto make Spring-driven transactions visible in OC4J's transaction monitor. In case of Spring's declarative transactions, the exposed name will (by default) be the fully-qualified class name + "." + method name.

Supports a per-transaction isolation level through OC4J's corresponding OC4JTransaction.setTransactionIsolation(int) method. This will apply the specified isolation level (e.g. ISOLATION_SERIALIZABLE) to all JDBC Connections that participate in the given transaction.

Automatically detects the available OC4J server version and adapts accordingly. Supports the "com.evermind.server" package in OC4J 10.1.3.2 as well as the "oracle.j2ee.transaction" package in later OC4J versions.

By default, the JTA UserTransaction and TransactionManager handles are fetched directly from OC4J's TransactionUtility in 10.1.3.2+. This can be overridden by specifying "userTransaction"/"userTransactionName" and "transactionManager"/"transactionManagerName", passing in existing handles or specifying corresponding JNDI locations to look up.

Thanks to Oracle for donating the original version of this extended OC4J integration code to the Spring project!

Since:
2.0.3
Author:
Paul Parkinson, Juergen Hoeller
See Also:
TransactionDefinition.getName(), TransactionDefinition.getIsolationLevel(), oracle.j2ee.transaction.OC4JTransactionManager#begin(String), oracle.j2ee.transaction.OC4JTransaction#setTransactionIsolation, oracle.j2ee.transaction.TransactionUtility, Serialized Form

Nested Class Summary
 
Nested classes/interfaces inherited from class org.springframework.transaction.support.AbstractPlatformTransactionManager
AbstractPlatformTransactionManager.SuspendedResourcesHolder
 
Field Summary
private  java.lang.reflect.Method beginWithNameMethod
           
private static java.lang.String FALLBACK_TRANSACTION_CLASS_NAME
           
private static java.lang.String FALLBACK_TRANSACTION_MANAGER_CLASS_NAME
           
private  java.lang.reflect.Method setTransactionIsolationMethod
           
private static java.lang.String TRANSACTION_CLASS_NAME
           
private static java.lang.String TRANSACTION_MANAGER_CLASS_NAME
           
private static java.lang.String TRANSACTION_UTILITY_CLASS_NAME
           
 
Fields inherited from class org.springframework.transaction.jta.JtaTransactionManager
DEFAULT_TRANSACTION_SYNCHRONIZATION_REGISTRY_NAME, DEFAULT_USER_TRANSACTION_NAME, FALLBACK_TRANSACTION_MANAGER_NAMES
 
Fields inherited from class org.springframework.transaction.support.AbstractPlatformTransactionManager
logger, SYNCHRONIZATION_ALWAYS, SYNCHRONIZATION_NEVER, SYNCHRONIZATION_ON_ACTUAL_TRANSACTION
 
Constructor Summary
OC4JJtaTransactionManager()
           
 
Method Summary
 void afterPropertiesSet()
          Initialize the UserTransaction as well as the TransactionManager handle.
 Transaction createTransaction(java.lang.String name, int timeout)
          Create an active Transaction object based on the given name and timeout.
protected  void doJtaBegin(JtaTransactionObject txObject, TransactionDefinition definition)
          Perform a JTA begin on the JTA UserTransaction or TransactionManager.
private  void loadOC4JTransactionClasses()
           
protected  UserTransaction retrieveUserTransaction()
          Allows subclasses to retrieve the JTA UserTransaction in a vendor-specific manner.
 
Methods inherited from class org.springframework.transaction.jta.JtaTransactionManager
applyIsolationLevel, applyTimeout, buildUserTransaction, checkUserTransactionAndTransactionManager, doBegin, doCommit, doGetJtaTransaction, doGetTransaction, doJtaResume, doJtaSuspend, doRegisterAfterCompletionWithJtaTransaction, doResume, doRollback, doSetRollbackOnly, doSuspend, findTransactionManager, findTransactionSynchronizationRegistry, findUserTransaction, getJndiEnvironment, getJndiTemplate, getTransactionManager, getUserTransaction, initTransactionSynchronizationRegistry, initUserTransactionAndTransactionManager, isExistingTransaction, lookupTransactionManager, lookupTransactionSynchronizationRegistry, lookupUserTransaction, registerAfterCompletionWithExistingTransaction, retrieveTransactionManager, retrieveTransactionSynchronizationRegistry, setAllowCustomIsolationLevels, setAutodetectTransactionManager, setAutodetectUserTransaction, setCacheUserTransaction, setJndiEnvironment, setJndiTemplate, setTransactionManager, setTransactionManagerName, setTransactionSynchronizationRegistryName, setUserTransaction, setUserTransactionName, shouldCommitOnGlobalRollbackOnly, supportsResourceAdapterManagedTransactions, useSavepointForNestedTransaction
 
Methods inherited from class org.springframework.transaction.support.AbstractPlatformTransactionManager
commit, determineTimeout, doCleanupAfterCompletion, getDefaultTimeout, getTransaction, getTransactionSynchronization, invokeAfterCompletion, isFailEarlyOnGlobalRollbackOnly, isGlobalRollbackOnParticipationFailure, isNestedTransactionAllowed, isRollbackOnCommitFailure, isValidateExistingTransaction, newTransactionStatus, prepareForCommit, prepareSynchronization, prepareTransactionStatus, resume, rollback, setDefaultTimeout, setFailEarlyOnGlobalRollbackOnly, setGlobalRollbackOnParticipationFailure, setNestedTransactionAllowed, setRollbackOnCommitFailure, setTransactionSynchronization, setTransactionSynchronizationName, setValidateExistingTransaction, suspend, triggerBeforeCommit, triggerBeforeCompletion
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

TRANSACTION_UTILITY_CLASS_NAME

private static final java.lang.String TRANSACTION_UTILITY_CLASS_NAME
See Also:
Constant Field Values

TRANSACTION_MANAGER_CLASS_NAME

private static final java.lang.String TRANSACTION_MANAGER_CLASS_NAME
See Also:
Constant Field Values

TRANSACTION_CLASS_NAME

private static final java.lang.String TRANSACTION_CLASS_NAME
See Also:
Constant Field Values

FALLBACK_TRANSACTION_MANAGER_CLASS_NAME

private static final java.lang.String FALLBACK_TRANSACTION_MANAGER_CLASS_NAME
See Also:
Constant Field Values

FALLBACK_TRANSACTION_CLASS_NAME

private static final java.lang.String FALLBACK_TRANSACTION_CLASS_NAME
See Also:
Constant Field Values

beginWithNameMethod

private java.lang.reflect.Method beginWithNameMethod

setTransactionIsolationMethod

private java.lang.reflect.Method setTransactionIsolationMethod
Constructor Detail

OC4JJtaTransactionManager

public OC4JJtaTransactionManager()
Method Detail

afterPropertiesSet

public void afterPropertiesSet()
                        throws TransactionSystemException
Description copied from class: JtaTransactionManager
Initialize the UserTransaction as well as the TransactionManager handle.

Specified by:
afterPropertiesSet in interface InitializingBean
Overrides:
afterPropertiesSet in class JtaTransactionManager
Throws:
TransactionSystemException
See Also:
JtaTransactionManager.initUserTransactionAndTransactionManager()

retrieveUserTransaction

protected UserTransaction retrieveUserTransaction()
                                           throws TransactionSystemException
Description copied from class: JtaTransactionManager
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.

Overrides:
retrieveUserTransaction in class JtaTransactionManager
Returns:
the JTA UserTransaction handle to use, or null if none found
Throws:
TransactionSystemException - in case of errors
See Also:
JtaTransactionManager.setUserTransaction(UserTransaction), JtaTransactionManager.setUserTransactionName(java.lang.String)

loadOC4JTransactionClasses

private void loadOC4JTransactionClasses()
                                 throws TransactionSystemException
Throws:
TransactionSystemException

doJtaBegin

protected void doJtaBegin(JtaTransactionObject txObject,
                          TransactionDefinition definition)
                   throws NotSupportedException,
                          SystemException
Description copied from class: JtaTransactionManager
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.

Overrides:
doJtaBegin in class JtaTransactionManager
Parameters:
txObject - the JtaTransactionObject containing the UserTransaction
definition - TransactionDefinition instance, describing propagation behavior, isolation level, read-only flag, timeout, and transaction name
Throws:
NotSupportedException - if thrown by JTA methods
SystemException - if thrown by JTA methods
See Also:
JtaTransactionManager.getUserTransaction(), JtaTransactionManager.getTransactionManager(), JtaTransactionManager.applyIsolationLevel(org.springframework.transaction.jta.JtaTransactionObject, int), JtaTransactionManager.applyTimeout(org.springframework.transaction.jta.JtaTransactionObject, int), JtaTransactionObject.getUserTransaction(), javax.transaction.UserTransaction#setTransactionTimeout, javax.transaction.UserTransaction#begin

createTransaction

public Transaction createTransaction(java.lang.String name,
                                     int timeout)
                              throws NotSupportedException,
                                     SystemException
Description copied from interface: TransactionFactory
Create an active Transaction object based on the given name and timeout.

Specified by:
createTransaction in interface TransactionFactory
Overrides:
createTransaction in class JtaTransactionManager
Parameters:
name - the transaction name (may be null)
timeout - the transaction timeout (may be -1 for the default timeout)
Returns:
the active Transaction object (never null)
Throws:
NotSupportedException - if the transaction manager does not support a transaction of the specified type
SystemException - if the transaction manager failed to create the transaction