package clear.transaction; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.transaction.HeuristicMixedException; import javax.transaction.HeuristicRollbackException; import javax.transaction.NotSupportedException; import javax.transaction.RollbackException; import javax.transaction.SystemException; import javax.transaction.UserTransaction; import org.apache.log4j.Logger; public class UserTransactionManager { public static final String USER_TX_JNDI_NAME = "java:comp/UserTransaction"; static Logger logger; static { logger = Logger.getLogger(UserTransactionManager.class); } private static ThreadLocal<UserTransaction> HOLDER = new ThreadLocal<UserTransaction>(); private static ThreadLocal<Integer> COUNTER = new ThreadLocal<Integer>(); private static UserTransaction createUserTransaction() throws NamingException, NotSupportedException, SystemException { Context ctx = new InitialContext(); final UserTransaction userTransaction = (UserTransaction) ctx .lookup(USER_TX_JNDI_NAME); userTransaction.begin(); if (logger.isDebugEnabled()) logger.debug("BEGIN userTransaction"); return userTransaction; } public static void joinUserTransaction() throws NamingException, NotSupportedException, SystemException { Integer count = COUNTER.get(); if (count == null) { UserTransaction ut = HOLDER.get(); if (ut == null) { ut = createUserTransaction(); HOLDER.set(ut); } COUNTER.set(1); } else { count = count.intValue() + 1; COUNTER.set(count); } } public static void commitUserTransaction() throws SecurityException, IllegalStateException, RollbackException, HeuristicMixedException, HeuristicRollbackException, SystemException { UserTransaction userTransaction = HOLDER.get(); Integer count = COUNTER.get(); if (count == null) { count = 0; } else if (count.intValue() > 0) { count = count.intValue() - 1; COUNTER.set(count); } if (count.intValue() == 0) { HOLDER.remove(); COUNTER.remove(); } if (userTransaction != null && count.intValue() == 0) { userTransaction.commit(); if (logger.isDebugEnabled()) logger.debug("COMMIT userTransaction"); } } public static void rollbackUserTransaction() throws IllegalStateException, SecurityException, SystemException { UserTransaction userTransaction = HOLDER.get(); HOLDER.remove(); COUNTER.remove(); if (userTransaction != null) { userTransaction.rollback(); if (logger.isDebugEnabled()) logger.debug("ROLLBACK userTransaction"); } } }