> Nope. This is a bug.

Really, ``begin` and ``abort`` are equivalent.  It might be better if
> there wasn't a ``begin`` method, as it's missleading. One should be an
> alias for the other. I'd be for deprecating ``begin``. The call to
> ``_new_transaction`` should be moved to the point in ``get`` where a
> new transaction is created, and ``begin`` should be made an alias for
> ``abort``.



Makes sense. I've created a bug report on launchpad here:

https://bugs.launchpad.net/zodb/+bug/1153116

Let me know if that's good or if there's somewhere else I'd need to report
it. Any idea when there would be a fix?



On Sat, Mar 9, 2013 at 5:50 AM, Jim Fulton <j...@zope.com> wrote:

> On Fri, Mar 8, 2013 at 9:54 PM, Siddhartha Kasivajhula
> <countvajh...@gmail.com> wrote:
> > Hi there,
> > I've been discussing this issue with Laurence Rowe on the pylons-dev
> mailing
> > list, and he suggested bringing it up here.
> >
> > I'm writing a MongoDB data manager for the python transaction package:
> > https://github.com/countvajhula/mongomorphism
> > I noticed that for a synchronizer, the beforeCompletion() and
> > afterCompletion() methods are always called once the synch has been
> > registered, but the newTransaction() method is only called when an
> explicit
> > call to transaction.begin() is made. Since it's possible for
> transactions to
> > be started without this explicit call, I was wondering if there was a
> good
> > reason why these two cases (explicitly vs implicitly begun transactions)
> > would be treated differently.
>
> Nope. This is a bug.
>
> > That is, should the following two cases not be
> > equivalent, and therefore should the newTransaction() method be called in
> > both cases:
> >
> > (1)
> > t = transaction.get()
> > t.join(my_dm)
> > ..some changes to the data..
> > transaction.commit()
> >
> > and:
> >
> > (2)
> > transaction.begin()
> > t = transaction.get()
> > t.join(my_dm)
> > ..some changes to the data..
> > transaction.commit()
>
> Only if (1) was was preceded by an ``abort``. The definition of
> ``get`` is to get the current transaction, creating one, if necessary.
>
> Really, ``begin` and ``abort`` are equivalent.  It might be better if
> there wasn't a ``begin`` method, as it's missleading. One should be an
> alias for the other. I'd be for deprecating ``begin``. The call to
> ``_new_transaction`` should be moved to the point in ``get`` where a
> new transaction is created, and ``begin`` should be made an alias for
> ``abort``.
>
>
> > In my mongo dm implementation, I am using the synchronizer to do some
> > initialization before each transaction gets underway, and am currently
> > requiring explicit calls to transaction.begin() at the start of each
> > transaction. Unfortunately, it appears that other third party libraries
> > using the transaction library may not be calling begin() explicitly, and
> in
> > particular my data manager doesn't work when used with pyramid_tm.
> >
> > Another thing I noticed was that a synchronizer cannot be registered like
> > so:
> > transaction.manager.registerSynch(MySynch())
> > .. and can only be registered like this:
> > synch = MySynch()
> > transaction.manager.registerSynch(synch)
> >
> > ... which I'm told is due to MySynch() being stored in a "WeakSet" which
> > means it gets garbage collected. Currently this means that I'm retaining
> a
> > reference to the synch as a global that I never use. Just seems a bit
> > contrived so thought I'd mention that as well, in case there's anything
> that
> > can be done about that.
>
> This is to prevent memory leaks.  Normally, the synchronizier is
> associated with a database. For example, the synchronizers are
> database connection methods.  A stand-alone synchronizer seems weird
> to me.
>
> Jim
>
> --
> Jim Fulton
> http://www.linkedin.com/in/jimfulton
> Jerky is better than bacon! http://zo.pe/Kqm
>
_______________________________________________
For more information about ZODB, see http://zodb.org/

ZODB-Dev mailing list  -  ZODB-Dev@zope.org
https://mail.zope.org/mailman/listinfo/zodb-dev

Reply via email to