[Mulgara-svn] r1069 - branches/mgr-121-lockrecovery/src/jar/resolver/java/org/mulgara/resolver
ronald at mulgara.org
ronald at mulgara.org
Mon Jul 7 14:26:51 UTC 2008
Author: ronald
Date: 2008-07-07 07:26:50 -0700 (Mon, 07 Jul 2008)
New Revision: 1069
Modified:
branches/mgr-121-lockrecovery/src/jar/resolver/java/org/mulgara/resolver/ExternalTransactionUnitTest.java
branches/mgr-121-lockrecovery/src/jar/resolver/java/org/mulgara/resolver/MulgaraExternalTransaction.java
Log:
Fix screwup in r1066 that broke insert-select and delete-select when using
external transactions: lastActive may be -1 when execute() is reentered
recursively, so use an explicit flag to check for completed transactions.
Modified: branches/mgr-121-lockrecovery/src/jar/resolver/java/org/mulgara/resolver/ExternalTransactionUnitTest.java
===================================================================
--- branches/mgr-121-lockrecovery/src/jar/resolver/java/org/mulgara/resolver/ExternalTransactionUnitTest.java 2008-07-07 13:31:13 UTC (rev 1068)
+++ branches/mgr-121-lockrecovery/src/jar/resolver/java/org/mulgara/resolver/ExternalTransactionUnitTest.java 2008-07-07 14:26:50 UTC (rev 1069)
@@ -105,6 +105,7 @@
suite.addTest(new ExternalTransactionUnitTest("testSimpleOnePhaseCommit"));
suite.addTest(new ExternalTransactionUnitTest("testSimpleTwoPhaseCommit"));
suite.addTest(new ExternalTransactionUnitTest("testBasicQuery"));
+ suite.addTest(new ExternalTransactionUnitTest("testBasicUpdate"));
suite.addTest(new ExternalTransactionUnitTest("testMultipleQuery"));
suite.addTest(new ExternalTransactionUnitTest("testBasicReadOnlyQuery"));
suite.addTest(new ExternalTransactionUnitTest("testConcurrentQuery"));
@@ -318,6 +319,113 @@
}
}
+ public void testBasicUpdate() throws URISyntaxException {
+ logger.info("Testing basicUpdate");
+
+ // straight insert and delete
+ try {
+ DatabaseSession session = (DatabaseSession)database.newSession();
+ try {
+ // start txn
+ XAResource resource = session.getXAResource();
+ Xid xid = new TestXid(1);
+ resource.start(xid, XAResource.TMNOFLAGS);
+
+ session.createModel(model2URI, null);
+
+ // insert data
+ session.insert(model2URI, Collections.singleton(new TripleImpl(
+ new URIReferenceImpl(URI.create("test:a")),
+ new URIReferenceImpl(URI.create("test:b")),
+ new URIReferenceImpl(URI.create("test:c")))));
+
+ // check it
+ Answer answer = session.query(createQuery(model2URI));
+ answer.beforeFirst();
+ assertTrue(answer.next());
+ assertEquals(new URIReferenceImpl(new URI("test:a")), answer.getObject(0));
+ assertEquals(new URIReferenceImpl(new URI("test:b")), answer.getObject(1));
+ assertEquals(new URIReferenceImpl(new URI("test:c")), answer.getObject(2));
+ assertFalse(answer.next());
+ answer.close();
+
+ // delete it
+ session.delete(model2URI, Collections.singleton(new TripleImpl(
+ new URIReferenceImpl(URI.create("test:a")),
+ new URIReferenceImpl(URI.create("test:b")),
+ new URIReferenceImpl(URI.create("test:c")))));
+
+ // check it
+ answer = session.query(createQuery(model2URI));
+ answer.beforeFirst();
+ assertFalse(answer.next());
+ answer.close();
+
+ session.removeModel(model2URI);
+
+ resource.end(xid, XAResource.TMSUCCESS);
+ resource.commit(xid, true);
+ } finally {
+ session.close();
+ }
+ } catch (Exception e) {
+ fail(e);
+ }
+
+ // insert-select and delete-select
+ try {
+ DatabaseSession session = (DatabaseSession)database.newSession();
+ try {
+ // start txn
+ XAResource resource = session.getXAResource();
+ Xid xid = new TestXid(1);
+ resource.start(xid, XAResource.TMNOFLAGS);
+
+ session.createModel(model2URI, null);
+ session.createModel(model3URI, null);
+
+ // insert data
+ session.insert(model2URI, Collections.singleton(new TripleImpl(
+ new URIReferenceImpl(URI.create("test:a")),
+ new URIReferenceImpl(URI.create("test:b")),
+ new URIReferenceImpl(URI.create("test:c")))));
+
+ // insert-select
+ session.insert(model3URI, createQuery(model2URI));
+
+ // check it
+ Answer answer = session.query(createQuery(model3URI));
+ answer.beforeFirst();
+ assertTrue(answer.next());
+ assertEquals(new URIReferenceImpl(new URI("test:a")), answer.getObject(0));
+ assertEquals(new URIReferenceImpl(new URI("test:b")), answer.getObject(1));
+ assertEquals(new URIReferenceImpl(new URI("test:c")), answer.getObject(2));
+ assertFalse(answer.next());
+ answer.close();
+
+ // delete it
+ session.delete(model3URI, createQuery(model2URI));
+
+ // check it
+ answer = session.query(createQuery(model3URI));
+ answer.beforeFirst();
+ assertFalse(answer.next());
+ answer.close();
+
+ // clean up
+ session.removeModel(model2URI);
+ session.removeModel(model3URI);
+
+ resource.end(xid, XAResource.TMSUCCESS);
+ resource.commit(xid, true);
+ } finally {
+ session.close();
+ }
+ } catch (Exception e) {
+ fail(e);
+ }
+ }
+
public void testMultipleQuery() throws URISyntaxException {
logger.info("Testing MultipleQuery");
Modified: branches/mgr-121-lockrecovery/src/jar/resolver/java/org/mulgara/resolver/MulgaraExternalTransaction.java
===================================================================
--- branches/mgr-121-lockrecovery/src/jar/resolver/java/org/mulgara/resolver/MulgaraExternalTransaction.java 2008-07-07 13:31:13 UTC (rev 1068)
+++ branches/mgr-121-lockrecovery/src/jar/resolver/java/org/mulgara/resolver/MulgaraExternalTransaction.java 2008-07-07 14:26:50 UTC (rev 1069)
@@ -70,6 +70,7 @@
private int heurCode;
private boolean rollback;
private String rollbackCause;
+ private boolean completed;
private volatile long lastActive;
MulgaraExternalTransaction(MulgaraExternalTransactionFactory factory, Xid xid, DatabaseOperationContext context)
@@ -90,6 +91,7 @@
this.hRollback = false;
this.heurCode = 0;
this.rollback = false;
+ this.completed = false;
this.lastActive = System.currentTimeMillis();
this.context.initiate(this);
@@ -123,6 +125,7 @@
return new MulgaraTransactionException(errorMessage, cause);
} finally {
+ completed = true;
factory.transactionComplete(this);
}
} finally {
@@ -239,7 +242,7 @@
throw factory.newException(exc, "Transaction was heuristically rolled back. Reason: " + rollbackCause);
if (rollback)
throw factory.newException(exc, "Transaction was rolled back. Reason: " + rollbackCause);
- if (lastActive < 0)
+ if (completed)
throw factory.newException(exc, "Transaction has been completed");
}
@@ -432,6 +435,8 @@
logger.error("Failed to abort transaction on cleanup failure", em2);
throw new XAException(XAException.XAER_RMFAIL);
}
+ } finally {
+ completed = true;
}
}
More information about the Mulgara-svn
mailing list