You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-dev@db.apache.org by ar...@apache.org on 2003/07/28 16:34:21 UTC
cvs commit: db-ojb/src/test/org/apache/ojb/odmg ODMGRollbackTest.java
arminw 2003/07/28 07:34:21
Modified: src/java/org/apache/ojb/odmg TransactionImpl.java
ObjectEnvelopeTable.java
src/test/org/apache/ojb/odmg ODMGRollbackTest.java
Log:
- fix checkpoint() problem posted by
Jeremy Wilkerson:
I'm using the ODMG API of OJB 1.0.rc3 with MySQL. When I call
checkpoint() on a Transaction, the underlying
database transaction isn't being committed.
- move PB.beginTranscation call from ObjectEnvelopeTable
to TransactionImpl
- make ObjectEnvelopeTable reuseable
Revision Changes Path
1.43 +15 -3 db-ojb/src/java/org/apache/ojb/odmg/TransactionImpl.java
Index: TransactionImpl.java
===================================================================
RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/odmg/TransactionImpl.java,v
retrieving revision 1.42
retrieving revision 1.43
diff -u -r1.42 -r1.43
--- TransactionImpl.java 7 Jun 2003 10:06:58 -0000 1.42
+++ TransactionImpl.java 28 Jul 2003 14:34:20 -0000 1.43
@@ -330,6 +330,13 @@
{
ObjectEnvelope item;
+ /*
+ arminw:
+ if broker isn't in PB-tx, start tx
+ */
+ if (log.isDebugEnabled()) log.debug("call beginTransaction() on PB instance");
+ if(!broker.isInTransaction()) broker.beginTransaction();
+
// Notify objects of impending commits.
Enumeration enum = objectEnvelopeTable.elements();
while (enum.hasMoreElements())
@@ -419,8 +426,9 @@
*/
try
{
- objectEnvelopeTable.close();
- objectEnvelopeTable = null;
+ objectEnvelopeTable.refresh();
+ // we reuse ObjectEnvelopeTable instance
+ // objectEnvelopeTable = null;
}
catch (Exception e)
{
@@ -457,6 +465,10 @@
try
{
doCommitOnObjects();
+ // do real commit
+ broker.commitTransaction();
+ // associate new PB instance
+ getBroker();
}
catch (Throwable t)
{
1.26 +32 -19 db-ojb/src/java/org/apache/ojb/odmg/ObjectEnvelopeTable.java
Index: ObjectEnvelopeTable.java
===================================================================
RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/odmg/ObjectEnvelopeTable.java,v
retrieving revision 1.25
retrieving revision 1.26
diff -u -r1.25 -r1.26
--- ObjectEnvelopeTable.java 28 Apr 2003 17:10:41 -0000 1.25
+++ ObjectEnvelopeTable.java 28 Jul 2003 14:34:20 -0000 1.26
@@ -116,13 +116,15 @@
*/
private boolean needsCommit = false;
- public void close()
+ /**
+ * prepare this instance for reuse
+ */
+ public void refresh()
{
/**
* MBAIRD: be nice and remove all references so they can be
* gc'd
*/
- transaction = null;
if (mhtObjectEnvelopes != null)
{
Iterator iter = mvOrderOfIds.iterator();
@@ -131,9 +133,11 @@
{
temp = (ObjectEnvelope) mhtObjectEnvelopes.get(iter.next());
temp.close();
- temp = null;
}
}
+ needsCommit = false;
+ mhtObjectEnvelopes.clear();
+ mvOrderOfIds.clear();
}
/**
@@ -166,9 +170,11 @@
// all neccessary db operations are executed within a PersistenceBroker transaction:
if (!broker.isInTransaction())
{
- if (log.isDebugEnabled())
- log.debug("call beginTransaction() on PB instance");
- broker.beginTransaction();
+// if (log.isDebugEnabled())
+// log.debug("call beginTransaction() on PB instance");
+// broker.beginTransaction();
+ log.error("PB associated with current odmg-tx is not in tx");
+ throw new TransactionAbortedException("Underlying PB is not in tx");
}
// Committing has to be done in two phases. First implicitly upgrade to lock on all related
@@ -190,10 +196,10 @@
// 4. execute batch
connMan.executeBatch();
-
+
// 5.Update all Envelopes to new CleanState
setCleanState();
-
+
}
catch (Throwable t)
{
@@ -213,6 +219,7 @@
}
finally
{
+ needsCommit = false;
connMan.setBatchMode(saveBatchMode);
}
}
@@ -317,7 +324,6 @@
needsCommit = true;
}
}
-
}
/**
@@ -325,19 +331,26 @@
*/
public void rollback()
{
- PersistenceBroker broker = transaction.getBroker();
- Iterator iter = mvOrderOfIds.iterator();
- while (iter.hasNext())
+ try
{
- ObjectEnvelope mod = (ObjectEnvelope) mhtObjectEnvelopes.get(iter.next());
- if (log.isDebugEnabled())
- log.debug("rollback: " + mod);
- // if the Object has been modified has been modified by transaction, mark object as dirty
- if (mod.hasChanged())
+ PersistenceBroker broker = transaction.getBroker();
+ Iterator iter = mvOrderOfIds.iterator();
+ while (iter.hasNext())
{
- mod.setModificationState(mod.getModificationState().markDirty());
+ ObjectEnvelope mod = (ObjectEnvelope) mhtObjectEnvelopes.get(iter.next());
+ if (log.isDebugEnabled())
+ log.debug("rollback: " + mod);
+ // if the Object has been modified has been modified by transaction, mark object as dirty
+ if (mod.hasChanged())
+ {
+ mod.setModificationState(mod.getModificationState().markDirty());
+ }
+ mod.getModificationState().rollback(mod, broker);
}
- mod.getModificationState().rollback(mod, broker);
+ }
+ finally
+ {
+ needsCommit = false;
}
}
1.14 +15 -17 db-ojb/src/test/org/apache/ojb/odmg/ODMGRollbackTest.java
Index: ODMGRollbackTest.java
===================================================================
RCS file: /home/cvs/db-ojb/src/test/org/apache/ojb/odmg/ODMGRollbackTest.java,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- ODMGRollbackTest.java 16 Jul 2003 11:21:39 -0000 1.13
+++ ODMGRollbackTest.java 28 Jul 2003 14:34:20 -0000 1.14
@@ -353,11 +353,10 @@
Transaction tx = ojb.newTransaction();
tx.begin();
storeObjects(tx, getNewODMGZoos(10));
- storeObjects(tx, getNewProjects(10));
- // now we bring objects to DB
+ // now we store objects to DB
tx.checkpoint();
-
- //we abort tx
+ storeObjects(tx, getNewProjects(10));
+ //we abort tx, all actions after the last checkpoint call should be rollback
tx.abort();
int odmgZoosAfter = getDBObjectCountWithNewPB(ODMGZoo.class);
@@ -365,23 +364,22 @@
int odmgZoosAfterOQL = getDBObjectCountViaOqlQueryUseNewTransaction(ojb, ODMGZoo.class);
int projectsAfterOQL = getDBObjectCountViaOqlQueryUseNewTransaction(ojb, Project.class);
- assertEquals("Wrong number of odmgZoos found", odmgZoosBefore, odmgZoosAfter);
+ assertEquals("Wrong number of odmgZoos found", odmgZoosBefore + 10, odmgZoosAfter);
assertEquals("Wrong number of projects found", projectsBefore, projectsAfter);
- assertEquals("Wrong number of odmgZoos found", (odmgZoosBefore), odmgZoosAfterOQL);
- assertEquals("Wrong number of projects found", (projectsBefore), projectsAfterOQL);
+ assertEquals("Wrong number of odmgZoos found", odmgZoosBefore + 10, odmgZoosAfterOQL);
+ assertEquals("Wrong number of projects found", projectsBefore, projectsAfterOQL);
- //We do this twice
+ //***********************
+ // do the procedure again
odmgZoosBefore = getDBObjectCountWithNewPB(ODMGZoo.class);
projectsBefore = getDBObjectCountWithNewPB(Project.class);
-
+ // we reuse current tx
tx.begin();
storeObjects(tx, getNewODMGZoos(10));
- storeObjects(tx, getNewProjects(10));
-
- // now we bring objects to DB
+ // now we store objects to DB
tx.checkpoint();
-
- //we abort tx
+ storeObjects(tx, getNewProjects(10));
+ //we abort tx, all actions after the last checkpoint call should be rollback
tx.abort();
odmgZoosAfter = getDBObjectCountWithNewPB(ODMGZoo.class);
@@ -389,10 +387,10 @@
odmgZoosAfterOQL = getDBObjectCountViaOqlQueryUseNewTransaction(ojb, ODMGZoo.class);
projectsAfterOQL = getDBObjectCountViaOqlQueryUseNewTransaction(ojb, Project.class);
- assertEquals("Wrong number of odmgZoos found", odmgZoosBefore, odmgZoosAfter);
+ assertEquals("Wrong number of odmgZoos found", odmgZoosBefore + 10, odmgZoosAfter);
assertEquals("Wrong number of projects found", projectsBefore, projectsAfter);
- assertEquals("Wrong number of odmgZoos found", (odmgZoosBefore), odmgZoosAfterOQL);
- assertEquals("Wrong number of projects found", (projectsBefore), projectsAfterOQL);
+ assertEquals("Wrong number of odmgZoos found", odmgZoosBefore + 10, odmgZoosAfterOQL);
+ assertEquals("Wrong number of projects found", projectsBefore, projectsAfterOQL);
}
finally
{
---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-dev-help@db.apache.org