[jboss-svn-commits] JBL Code SVN: r12623 - labs/jbosstm/branches/JBOSSTS_4_2_3_GA_SP/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Jun 15 13:15:28 EDT 2007


Author: jhalliday
Date: 2007-06-15 13:15:28 -0400 (Fri, 15 Jun 2007)
New Revision: 12623

Modified:
   labs/jbosstm/branches/JBOSSTS_4_2_3_GA_SP/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/TransactionImple.java
Log:
Thread/transaction disassociation fixes for http://jira.jboss.com/jira/browse/JBTM-227
which in turn partially resolves http://jira.jboss.com/jira/browse/JBAS-4481


Modified: labs/jbosstm/branches/JBOSSTS_4_2_3_GA_SP/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/TransactionImple.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_2_3_GA_SP/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/TransactionImple.java	2007-06-15 17:02:48 UTC (rev 12622)
+++ labs/jbosstm/branches/JBOSSTS_4_2_3_GA_SP/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/TransactionImple.java	2007-06-15 17:15:28 UTC (rev 12623)
@@ -1239,41 +1239,45 @@
 			jtaLogger.logger.debug(DebugLevel.FUNCTIONS, VisibilityLevel.VIS_PUBLIC, com.arjuna.ats.jta.logging.FacilityCode.FAC_JTA, "TransactionImple.commitAndDisassociate");
 		}
 
-        try
-        {
-    		if (_theTransaction != null)
-    		{
-    			switch (_theTransaction.status())
-    			{
-    			case ActionStatus.RUNNING:
-    			case ActionStatus.ABORT_ONLY:
-    				break;
-                case ActionStatus.ABORTED:
-                    _theTransaction.abort() ;
-    			default:
-    				throw new IllegalStateException(
-    						jtaLogger.logMesg.getString("com.arjuna.ats.internal.jta.transaction.arjunacore.inactive"));
-    			}
+		try
+		{
+			if (_theTransaction != null)
+			{
+				switch (_theTransaction.status())
+				{
+					case ActionStatus.ABORTED:
+					case ActionStatus.ABORTING:
+						_theTransaction.abort(); // assure thread disassociation
+						throw new IllegalStateException(
+								jtaLogger.logMesg.getString("com.arjuna.ats.internal.jta.transaction.arjunacore.inactive"));
 
+					case ActionStatus.COMMITTED:
+					case ActionStatus.COMMITTING: // in case of async commit
+						_theTransaction.commit(true); // assure thread disassociation
+						throw new IllegalStateException(
+								jtaLogger.logMesg.getString("com.arjuna.ats.internal.jta.transaction.arjunacore.inactive"));
+				}
+
 				switch (_theTransaction.commit(true))
 				{
-				case ActionStatus.COMMITTED:
-				case ActionStatus.COMMITTING: // in case of async commit
-					break;
-				case ActionStatus.H_MIXED:
-					throw new javax.transaction.HeuristicMixedException();
-				case ActionStatus.H_HAZARD:
-					throw new javax.transaction.HeuristicMixedException();
-				case ActionStatus.H_ROLLBACK:
-				case ActionStatus.ABORTED:
-					RollbackException rollbackException = new RollbackException(jtaLogger.logMesg.getString("com.arjuna.ats.internal.jta.transaction.arjunacore.commitwhenaborted"));
-					if(_theTransaction.getDeferredThrowable() != null) {
-						rollbackException.initCause(_theTransaction.getDeferredThrowable());
-					}
-					throw rollbackException;
-				default:
-					throw new IllegalStateException(
-							jtaLogger.logMesg.getString("com.arjuna.ats.internal.jta.transaction.arjunacore.invalidstate"));
+					case ActionStatus.COMMITTED:
+					case ActionStatus.COMMITTING: // in case of async commit
+						break;
+					case ActionStatus.H_MIXED:
+						throw new javax.transaction.HeuristicMixedException();
+					case ActionStatus.H_HAZARD:
+						throw new javax.transaction.HeuristicMixedException();
+					case ActionStatus.H_ROLLBACK:
+					case ActionStatus.ABORTED:
+					case ActionStatus.ABORTING:
+						RollbackException rollbackException = new RollbackException(jtaLogger.logMesg.getString("com.arjuna.ats.internal.jta.transaction.arjunacore.commitwhenaborted"));
+						if(_theTransaction.getDeferredThrowable() != null) {
+							rollbackException.initCause(_theTransaction.getDeferredThrowable());
+						}
+						throw rollbackException;
+					default:
+						throw new IllegalStateException(
+								jtaLogger.logMesg.getString("com.arjuna.ats.internal.jta.transaction.arjunacore.invalidstate"));
 				}
 			}
 			else
@@ -1312,44 +1316,36 @@
 			jtaLogger.logger.debug(DebugLevel.FUNCTIONS, VisibilityLevel.VIS_PUBLIC, com.arjuna.ats.jta.logging.FacilityCode.FAC_JTA, "TransactionImple.rollbackAndDisassociate");
 		}
 
-		if (_theTransaction != null)
-		{
-			switch (_theTransaction.status())
-			{
-			case ActionStatus.RUNNING:
-			case ActionStatus.ABORT_ONLY:
-				break;
-			default:
-				throw new IllegalStateException(
-						jtaLogger.logMesg.getString("com.arjuna.ats.internal.jta.transaction.arjunacore.inactive"));
-			}
-		}
-
 		try
 		{
+			boolean statusIsValid = false;
+
 			if (_theTransaction != null)
 			{
-				int outcome = _theTransaction.abort();
+				if(_theTransaction.status() == ActionStatus.RUNNING || _theTransaction.status() == ActionStatus.ABORT_ONLY) {
+					// in these cases we may be able to finish without throwing an exception, if nothing else goes wrong...
+					statusIsValid = true;
+				}
 
+				int outcome = _theTransaction.abort(); // assure thread disassociation, even if tx is already done.
+
 				switch (outcome)
 				{
-				case ActionStatus.ABORTED:
-				case ActionStatus.ABORTING: // in case of async rollback
-					break;
-				default:
-					throw new IllegalStateException(
-							jtaLogger.logMesg.getString("com.arjuna.ats.internal.jta.transaction.arjunacore.rollbackstatus")
-									+ ActionStatus.stringForm(outcome));
+					case ActionStatus.ABORTED:
+					case ActionStatus.ABORTING: // in case of async rollback
+						break;
+					default:
+						throw new IllegalStateException(
+								jtaLogger.logMesg.getString("com.arjuna.ats.internal.jta.transaction.arjunacore.rollbackstatus")
+										+ ActionStatus.stringForm(outcome));
 				}
 			}
-			else
+
+			if(_theTransaction == null || !statusIsValid) {
 				throw new IllegalStateException(
 						jtaLogger.logMesg.getString("com.arjuna.ats.internal.jta.transaction.arjunacore.inactive"));
+			}
 		}
-		catch (IllegalStateException ex)
-		{
-			throw ex;
-		}
 		finally
 		{
 			TransactionImple.removeTransaction(this);




More information about the jboss-svn-commits mailing list