python - Retry on deadlock for MySQL / SQLAlchemy -


i have searched quite time , can't found solution problem. using sqlalchemy in conjunction mysql our project , encounter several time dreaded error:

1213, 'deadlock found when trying lock; try restarting transaction'.

we try restart transaction @ 3 times in case.

i have started write decorator don't know how save session state before fail , retry same transaction after ? (as sqlalchemy requires rollback whenever exception raised)

my work far,

def retry_on_deadlock_decorator(func):     lock_messages_error = ['deadlock found', 'lock wait timeout exceeded']      @wraps(func)     def wrapper(*args, **kwargs):         attempt_count = 0         while attempt_count < settings.maximum_retry_on_deadlock:             try:                 return func(*args, **kwargs)             except operationalerror e:                 if any(msg in e.message msg in lock_messages_error) \                         , attempt_count <= settings.maximum_retry_on_deadlock:                     logger.error('deadlock detected. trying sql transaction once more. attempts count: %s'                                  % (attempt_count + 1))                 else:                     raise             attempt_count += 1     return wrapper 

did use code this?

try:        perform table transaction       break  except:       rollback       delay       try again perform table transaction  

the way handle deadlocks write code expect them. isn't difficult if database code written. can put try/catch around query execution logic , deadlock when errors occur. if catch one, normal thing attempt execute failed query again.

usefull links:


Comments

Popular posts from this blog

how to proxy from https to http with lighttpd -

android - Automated my builds -

python - Flask migration error -