Hi Mahler,
Thank you again Mahler. You saved me a lot of work :-)
Just a final question: if this behavior is already implemented, why does
the documentation (http://db.apache.org/ojb/objectcache.html) say we need to
remove the objects from the cache after the transaction rollback? Is the
documentation wrong or out of date?
Thanks,
Jair Jr
----- Original Message -----
From: "Mahler Thomas" <[EMAIL PROTECTED]>
To: "'OJB Users List'" <[EMAIL PROTECTED]>
Sent: Wednesday, October 29, 2003 9:44 AM
Subject: RE: how to get objects locked by a transaction?
> Hi Jair,
>
>
> > Hi,
> > Thank you Mahler for your fast reply.
> > I understand that it is not possible to do it with the
> > current OJB API.
> > I am asking you this because I need to remove from OJB
> > cache the objects
> > touched by a transaction when it is aborted.
> > Here is what I think could be a good idea to fix this
> > issue: as noted in
> > the OJB cache documentation
> > (http://db.apache.org/ojb/objectcache.html), the
> > OJB user must manually remove each object touched by the
> > trasaction when
> > using ObjectCacheDefaultImpl and the transaction is aborted
> > because the
> > objects may be corrupted. So why doesn't the implementation of the
> > Transaction.abort method removes the touched objets from the
> > cache? I think
> > this should fix this issue, don't you?
>
> That's already implemented!
> The ObjectENvelopeTable.rollback() method performs rollback actions for
all
> registered objects.
>
> public void rollback()
> {
> PersistenceBroker broker = transaction.getBroker();
> Iterator iter = mvOrderOfIds.iterator();
> while (iter.hasNext())
> {
> 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);
> }
> }
>
> The ModificationState.rollback(...) calls remove dirty instances from the
> cache.
> For example the StateOldDirty.rollback method looks like follows:
> public void rollback(ObjectEnvelope mod, PersistenceBroker broker)
> {
> this.removeFromCache(mod.getObject(), broker);
> // Call added to rollback the object itself so it has the previous
> values again when it is used further on.
> mod.rollback();
> }
>
> clean Objects (that is Objects not modified during the transaction) will
not
> be removed from the cache!
>
>
> > Well, it's just an idea. In my system I am going to
> > remove the objects
> > from cache manually, but as there's no way to get only the
> > objects touched
> > by the transaction I'll have to clear the entire cache.
>
> I thinks that's not necessary, given my above explanation.
>
> cheers,
> thomas
>
> > Thanks,
> > Jair Jr
> >
> > ----- Original Message -----
> > From: "Mahler Thomas" <[EMAIL PROTECTED]>
> > To: "'OJB Users List'" <[EMAIL PROTECTED]>
> > Sent: Tuesday, October 28, 2003 1:45 PM
> > Subject: RE: how to get objects locked by a transaction?
> >
> >
> > > Hello Jair,
> > >
> > > OJB ODMG stores each registered Objects in an
> > o.a.ojb.odmg.ObjectEnvelope.
> > > All ObjectEnvelopes are kept in an o.a.ojb.odmg.ObjectEnvelopeTable.
> > > ObjectEnvelopeTable has a public method
> > > public Enumeration elements();
> > >
> > > which returns an Enumeration of all ObjectEnvelopes.
> > >
> > > The each OJB ODMG TransactionImpl maintains its own
> > ObjectEnvelopeTable:
> > > /**
> > > * the internal table containing all Objects "touched"
> > by this tx and
> > > their
> > > * respective transactional state
> > > */
> > > private ObjectEnvelopeTable objectEnvelopeTable = null;
> > >
> > > Currently TransactionImpl does not provide public access to the
> > > ObjectEnvelopeTable.
> > > So I don't see a way to perform your task without changing
> > OJB code...
> > >
> > > cheers,
> > > Thomas
> > >
> > > > -----Original Message-----
> > > > From: Jair da Silva Ferreira J�nior [mailto:[EMAIL PROTECTED]
> > > > Sent: Tuesday, October 28, 2003 12:25 AM
> > > > To: OJB Users List
> > > > Subject: how to get objects locked by a transaction?
> > > >
> > > >
> > > > Hello,
> > > > How can I safely get all objects locked by a transaction
> > > > using ODMG or broker API?
> > > > I need this because I want to remove all objects locked
> > > > by a transaction from the cache. Something like this:
> > > >
> > > > .....
> > > > Iterator lockedObjects=getLockedObjects(transaction);
> > > > while(lockedObjects.hasNext()){
> > > > broker.removeFromCache(lockedObjects.next());
> > > > }
> > > > .....
> > > >
> > > > Thanks,
> > > > Jair Jr
> > > >
> > >
> > >
> > >
> > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > > For additional commands, e-mail: [EMAIL PROTECTED]
> > >
> > >
> > >
> >
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> >
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]