[elephant-devel] Re: Updated version of last Postmodern patch bundle
    Alex Mizrahi 
    killerstorm at newmail.ru
       
    Tue Mar 18 13:20:01 UTC 2008
    
    
  
 ??>> changing isolation level is dead simple, but it requires dealing with
 ??>> consequences. this was pretty hard for application i'm working with,
 ??>> so i had to make extensions like retry-cleanup-fn.
 LPP> Can you elaborate on that? Seems complicated...
retry-cleanup-fn? it's actually pretty simple -- it gives application 
ability to hook it's code just before restarting transaction.
this way application can do custom cleanup.
for example, i'm working with UCW. it has built-in retry restart implemented 
this way:
(try-again ()
      :report "Restart the HANDLE-REQUEST protocol at the server level"
      (clear-response response)
      (handle-request server request response))
it clears what application have generated so far and starts handling request 
over.
i can do this cleanup via retry-cleanup-fn:
(ele:with-transaction (:retry-cleanup-fn (lambda (&rest ignored) 
(ucw::clear-response response)))
  ..code..)
this will work fine if transaction is around handle-request.
alternatively, i can use retry-cleanup-fn to implement custom retry 
strategy -- i.e. call try-again restart:
(ele:with-transaction (:retry-cleanup-fn (lambda (&rest ignored) 
(invoke-restart 'ucw::try-again)))
  ..code..)
we'll lose retry counting ability because there will be non-local control 
transfer into UCW's retry implementation, but it should otherwise work fine 
if with-transaction is inside handle-request.
also this can be used to do logging:
(ele:with-transaction
    (:retry-cleanup-fn
           (lambda (condition sc)
            (declare (ignore sc))
            (lg.warn "got database error: ~a, retrying transaction~%" 
condition)
            (ucw::clear-response (context.response *context*))))
...)
this might help analysing performance problems
so this appears to be quite a useful extension -- it allows us to integrated 
elephant's transaction handling into relatively complex applications not 
specially designed for transaction restarts.
    
    
More information about the elephant-devel
mailing list