Ho cercato per un po 'di tempo e non riesco a trovare una soluzione al mio problema. Stiamo utilizzando SQLAlchemy in collaborazione con MySQL per il nostro progetto e ci incontriamo più volte l'errore temuto:Retry on deadlock per MySQL/SQLAlchemy
1213, 'Deadlock found when trying to get lock; try restarting transaction'.
Vorremmo provare a riavviare la transazione al massimo tre volte in questo caso.
Ho iniziato a scrivere un decoratore che esegue questa operazione ma non so come salvare lo stato della sessione prima del fail e riprovare la stessa transazione dopo di essa? (Come SQLAlchemy richiede un rollback ogni volta che viene sollevata un'eccezione)
Il mio lavoro fino ad ora,
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 as e:
if any(msg in e.message for msg in lock_messages_error) \
and 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
Ti ho aiutato? O hai trovato un'altra soluzione. Si prega di condividere qualsiasi risultato. –