Szukałem już od jakiegoś czasu i nie mogę znaleźć rozwiązania mojego problemu. Jesteśmy przy użyciu SQLAlchemy w połączeniu z MySQL do naszego projektu i mamy do czynienia kilka razy bał błąd:Spróbuj ponownie w przypadku zakleszczenia MySQL/SQLAlchemy
1213, 'Deadlock found when trying to get lock; try restarting transaction'.
Chcielibyśmy, aby spróbować ponownie uruchomić transakcję co najwyżej trzy razy w tym przypadku.
Zacząłem pisać dekorator, który robi to, ale nie wiem, jak zapisać stan sesji przed niepowodzeniem i ponowić tę samą transakcję po nim? (Jak SQLAlchemy wymaga cofnięcia, gdy wyjątek jest podniesiona)
mojej pracy tak daleko,
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
Czy mogę ci pomóc? Albo znalazłeś inne rozwiązanie. Udostępnij dowolny wynik. –