[Zope] Zope Freezing up with multiple threads accessing
objects.
Etienne Labuschagne
elabuschagne@gmsonline.co.za
Thu, 17 Jul 2003 14:03:17 +0200
At 09:21 PM 16/7/2003 +0200, you wrote:
>Etienne Labuschagne wrote at 2003-7-16 00:48 +0200:
> > ...
> > The above is abbreviated, but I can send you a more verbose list with
> stack
> > traces for each step. I printed out the
> > threading.currentThread().getName()s every step to check which threads
> are
> > doing what.
>
>I am not really interested in a detailed log :-)
>
>"Storage._transaction" is set in "tpc_begin" and reset in
>"tpc_abort" and "tpc_finish".
>
>When the check "transaction is self._transaction" fails,
>look at "self._transaction".
>When is is None, then
>someone (maybe a different thread) called "tpc_abort" or "tpc_finish"
>or (not likely "tpc_begin" was not executed).
>When it is not None, then its value specifies the transaction
>that most recently executed "tpc_begin". This must be a different
>thread (since there is one transaction per thread and "transaction"
>is ours).
>
>
>Dieter
Hi there,
Thanks again for the pointers above - I helped me find my problem. I made
one critically wrong assumption: I assumed a piece of code that I called
doesn't change any ZODB objects, so I need not call
get_transaction().commit() or abort(). Well, the code DID change a Zope
object!
This had the wonderful side effect that the object stayed in the
Transaction object. This would probably have the effect of causing a
memory leak, but for one thing: since Transactions are identified according
to thread ids, and thread ids are re-used after previous threads using them
exited (well, in Windows anyway), new threads ended up using Transaction
objects which still have uncommitted objects in them. These objects are
then mixed with the new thread's changed objects which has the same effect
as changing ZODB objects from multiple threads - (so you WERE right saying
I changed objects from multiple threads! ;)
I assume it is safe to call get_transaction().abort() if I'm not sure if
the code changed anything and doesn't care if changes are lost? This is
probably better than having unfinished transactions lurking around to bite me.
Thanks again!
Etienne