Le 29/03/2012 20:28, Claudiu Saftoiu a écrit :
Hello all,

I have an HTTP request which has roughly two parts to it. One part
requires a lot of processing with a small chance of a DatabaseConflict,
while the other part requires little processing with a high chance of
a DatabaseConflict. I'd like to do something like this:

def my_view(request):
    transaction.begin()
    slow_no_conflict()
    transaction.commit()
    for avar in something:
        transaction.begin()
        fast_yes_conflict(avar)
        transaction.commit()

My question is: how will automatic retrying work? Most of my views are simply:

def regular_view(request):
    do_stuff()

and, if something conflicts, the whole thing is just retried. In `my_view`,
what will happen if the `slow_no_conflict()` function has a conflict?
What will happen if the `fast_yes_conflict(avar)` function has a conflict?
What if its in the first iteration of the loop, or the last? I'm not quite sure
how to properly think about these things yet.

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 !

Alex

--
Alexandre Garel
06 78 33 15 37

_______________________________________________
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