[Mulgara-svn] r577 - branches/mgr-73/src/jar/resolver/java/org/mulgara/resolver

andrae at mulgara.org andrae at mulgara.org
Thu Nov 22 09:37:06 UTC 2007


Author: andrae
Date: 2007-11-22 03:37:06 -0600 (Thu, 22 Nov 2007)
New Revision: 577

Modified:
   branches/mgr-73/src/jar/resolver/java/org/mulgara/resolver/MulgaraInternalTransactionFactory.java
   branches/mgr-73/src/jar/resolver/java/org/mulgara/resolver/MulgaraTransactionFactory.java
Log:
Wrapped calls to transaction control operations within a call to
execute(TransactionalOperation) - required to ensure calls to activate are made
correctly.



Modified: branches/mgr-73/src/jar/resolver/java/org/mulgara/resolver/MulgaraInternalTransactionFactory.java
===================================================================
--- branches/mgr-73/src/jar/resolver/java/org/mulgara/resolver/MulgaraInternalTransactionFactory.java	2007-11-22 09:34:18 UTC (rev 576)
+++ branches/mgr-73/src/jar/resolver/java/org/mulgara/resolver/MulgaraInternalTransactionFactory.java	2007-11-22 09:37:06 UTC (rev 577)
@@ -90,7 +90,7 @@
       throws MulgaraTransactionException {
     acquireMutex();
     try {
-      if (write && manager.isHoldingWriteLock(session)) {
+      if (manager.isHoldingWriteLock(session)) {
         return writeTransaction;
       }
 
@@ -173,7 +173,11 @@
       try {
         if (manager.isHoldingWriteLock(session)) {
           try {
-            writeTransaction.heuristicRollback("Explicit Rollback");
+            writeTransaction.execute(new TransactionOperation() {
+                public void execute() throws MulgaraTransactionException {
+                  writeTransaction.heuristicRollback("Explicit Rollback");
+                }
+            });
             // FIXME: Should be checking status here, not writelock.
             if (manager.isHoldingWriteLock(session)) {
               // transaction referenced by something - need to explicitly end it.
@@ -225,7 +229,12 @@
                 }
               });
             } finally {
-              manager.releaseWriteLock(session);
+              // This should have been cleaned up by the commit above, but if it
+              // hasn't then if we don't release here we could deadlock the
+              // transaction manager
+              if (manager.isHoldingWriteLock(session)) {
+                manager.releaseWriteLock(session);
+              }
               this.autoCommit = true;
             }
           } else if (failedSessions.contains(session)) {

Modified: branches/mgr-73/src/jar/resolver/java/org/mulgara/resolver/MulgaraTransactionFactory.java
===================================================================
--- branches/mgr-73/src/jar/resolver/java/org/mulgara/resolver/MulgaraTransactionFactory.java	2007-11-22 09:34:18 UTC (rev 576)
+++ branches/mgr-73/src/jar/resolver/java/org/mulgara/resolver/MulgaraTransactionFactory.java	2007-11-22 09:37:06 UTC (rev 577)
@@ -117,7 +117,11 @@
             try {
               if (writeTransaction != null) {
                 logger.warn("Terminating session while holding writelock:" + session + ": " + writeTransaction);
-                writeTransaction.heuristicRollback("Session closed while holding write lock");
+                writeTransaction.execute(new TransactionOperation() {
+                    public void execute() throws MulgaraTransactionException {
+                      writeTransaction.heuristicRollback("Session closed while holding write lock");
+                    }
+                });
               }
             } finally {
               manager.releaseWriteLock(session);
@@ -130,7 +134,13 @@
 
         for (MulgaraTransaction transaction : getTransactionsForSession(session)) {
           try {
-            transaction.heuristicRollback("Rollback due to session close");
+            // This is final so we can create the closure.
+            final MulgaraTransaction xa = transaction;
+            transaction.execute(new TransactionOperation() {
+                public void execute() throws MulgaraTransactionException {
+                  xa.heuristicRollback("Rollback due to session close");
+                }
+            });
           } catch (Throwable th) {
             requiresAbort.put(transaction, th);
             if (error == null) {




More information about the Mulgara-svn mailing list