[Mulgara-svn] r566 - branches/mgr-73/src/jar/resolver/java/org/mulgara/resolver
andrae at mulgara.org
andrae at mulgara.org
Wed Nov 21 11:09:29 UTC 2007
Author: andrae
Date: 2007-11-21 05:09:28 -0600 (Wed, 21 Nov 2007)
New Revision: 566
Modified:
branches/mgr-73/src/jar/resolver/java/org/mulgara/resolver/MulgaraInternalTransactionFactory.java
Log:
Fixed up compliance with interfaces, as well as several compile-errors.
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-16 06:20:02 UTC (rev 565)
+++ branches/mgr-73/src/jar/resolver/java/org/mulgara/resolver/MulgaraInternalTransactionFactory.java 2007-11-21 11:09:28 UTC (rev 566)
@@ -38,8 +38,8 @@
// Local packages
import org.mulgara.query.MulgaraTransactionException;
-import org.mulgara.server.Session;
import org.mulgara.transaction.TransactionManagerFactory;
+import org.mulgara.util.Assoc1toNMap;
/**
* Implements the internal transaction controls offered by Session.
@@ -63,19 +63,25 @@
private boolean autoCommit;
/** Set of sessions whose transactions have been rolledback.*/
- private Set<Session> failedSessions;
+ private Set<DatabaseSession> failedSessions;
/** Map of threads to active transactions. */
private Map<Thread, MulgaraTransaction> activeTransactions;
+ private Assoc1toNMap<DatabaseSession, MulgaraTransaction> sessionXAMap;
+
private final TransactionManager transactionManager;
+ private MulgaraInternalTransaction internalWriteTransaction;
+
public MulgaraInternalTransactionFactory(MulgaraTransactionManager manager, TransactionManagerFactory transactionManagerFactory) {
super(manager);
this.autoCommit = true;
- this.failedSessions = new HashSet<Session>();
+ this.failedSessions = new HashSet<DatabaseSession>();
this.activeTransactions = new HashMap<Thread, MulgaraTransaction>();
+ this.sessionXAMap = new Assoc1toNMap<DatabaseSession, MulgaraTransaction>();
+ this.internalWriteTransaction = null;
this.transactionManager = transactionManagerFactory.newTransactionManager();
}
@@ -98,16 +104,14 @@
});
try {
assert writeTransaction == null;
- writeTransaction = transaction = newMulgaraTransaction(session.newOperationContext(true));
- } catch (MulgaraTransactionException em) {
- manager.releaseWriteLock(session);
- throw em;
+ writeTransaction = internalWriteTransaction = transaction =
+ new MulgaraInternalTransaction(this, session.newOperationContext(true));
} catch (Throwable th) {
manager.releaseWriteLock(session);
throw new MulgaraTransactionException("Error creating write transaction", th);
}
} else {
- transaction = newMulgaraTransaction(session.newOperationContext(false));
+ transaction = new MulgaraInternalTransaction(this, session.newOperationContext(false));
}
sessionXAMap.put(session, transaction);
@@ -123,6 +127,10 @@
}
}
+ public Set<MulgaraTransaction> getTransactionsForSession(DatabaseSession session) {
+ Set <MulgaraTransaction> xas = sessionXAMap.getN(session);
+ return xas == null ? new HashSet<MulgaraTransaction>() : xas;
+ }
public MulgaraTransaction newMulgaraTransaction(DatabaseOperationContext context)
throws MulgaraTransactionException {
@@ -133,11 +141,11 @@
public void commit(DatabaseSession session) throws MulgaraTransactionException {
acquireMutex();
try {
- manager.reserveWriteLock();
+ manager.reserveWriteLock(session);
try {
if (failedSessions.contains(session)) {
throw new MulgaraTransactionException("Attempting to commit failed exception");
- } else if (session != currentWritingSession) {
+ } else if (!manager.isHoldingWriteLock(session)) {
throw new MulgaraTransactionException(
"Attempting to commit while not the current writing transaction");
}
@@ -145,7 +153,7 @@
setAutoCommit(session, true);
setAutoCommit(session, false);
} finally {
- manager.releaseReserve();
+ manager.releaseReserve(session);
}
} finally {
releaseMutex();
@@ -161,11 +169,11 @@
public void rollback(DatabaseSession session) throws MulgaraTransactionException {
acquireMutex();
try {
- manager.reserveWriteLock();
+ manager.reserveWriteLock(session);
try {
if (manager.isHoldingWriteLock(session)) {
try {
- writeTransaction.rollback("Explicit Rollback");
+ 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.
@@ -184,7 +192,7 @@
"Attempt to rollback while not in the current writing transaction");
}
} finally {
- manager.releaseReserve();
+ manager.releaseReserve(session);
}
} finally {
releaseMutex();
@@ -210,14 +218,14 @@
public void execute() throws MulgaraTransactionException {
writeTransaction.execute(new TransactionOperation() {
public void execute() throws MulgaraTransactionException {
- writeTransaction.dereference();
- writeTransaction.commitTransaction();
+ internalWriteTransaction.dereference();
+ internalWriteTransaction.commitTransaction();
}
});
}
});
} finally {
- releaseWriteLock();
+ manager.releaseWriteLock(session);
this.autoCommit = true;
}
} else if (failedSessions.contains(session)) {
@@ -234,7 +242,7 @@
logger.info("Attempting to set autocommit true without setting it false");
} else {
// AutoCommit on -> off == Start new transaction.
- writeTransaction = getTransaction(session, true);
+ getTransaction(session, true); // Set's writeTransaction.
writeTransaction.reference();
this.autoCommit = false;
}
@@ -330,12 +338,17 @@
}
}
- public void transactionComplete(MulgaraTransaction transaction) {
+ public void transactionComplete(MulgaraTransaction transaction) throws MulgaraTransactionException {
acquireMutex();
try {
- if (transaction == writeTransaction) {
+ DatabaseSession session = sessionXAMap.get1(transaction);
+ if (session == null) {
+ throw new MulgaraTransactionException("No associated session found for transaction");
+ }
+ if (manager.isHoldingWriteLock(session)) {
manager.releaseWriteLock(session);
writeTransaction = null;
+ internalWriteTransaction = null;
}
sessionXAMap.removeN(transaction);
@@ -351,7 +364,7 @@
try {
// Make sure this cleans up the transaction metadata - this transaction is DEAD!
if (transaction == writeTransaction) {
- failedSessions.add(currentWritingSession);
+ failedSessions.add(sessionXAMap.get1(transaction));
}
transactionComplete(transaction);
} catch (Throwable th) {
More information about the Mulgara-svn
mailing list