Re: ZODB-Dev Digest, Vol 108, Issue 17

View: New views
1 Messages — Rating Filter:   Alert me  

Parent Message unknown Re: ZODB-Dev Digest, Vol 108, Issue 17

by Claudiu Saftoiu :: Rate this Message:

| View Threaded | Show Only this Message

Hello retry shall be made on a transaction basis.

I would say, that while for the regular_view retry may be handled by a
middleware or such (the publisher in Zope2 ?), you may want to manage it
in my_view around your transaction.

in my_view you do transaction commit, so you won't undo the
slow_no_conflict part if you fail in the second part (if it was not your
intent you shall use subtransactions).

So you may do something like :

from ZODB.POSException import ConflictError

def my_view(request):

    transaction.begin()
    slow_no_conflict()
    transaction.commit()

    do_retry = True
    while do_retry:
       try:
          transaction.begin()
          fast_yes_conflict(avar)
          transaction.commit()
          do_retry = False
       except Exception, e:
          transaction.abort()
          do_retry = isinstance(e, ConflictError)


Hope this helps !

That does help, thanks! Makes a lot of sense, too. Question - will hooks added with `addAfterCommitHook()` be called
if a transaction is aborted? Also, in what situation is a web request retried automatically - is it if
the function handling the request raises a ConflictError (e.g. by not catching a .commit() that fails)?

Thanks,
- Claudiu

_______________________________________________
For more information about ZODB, see http://zodb.org/

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