mysql 重试_重试MySQL/SQLAlchemy的死锁
我已經(jīng)找了很長(zhǎng)時(shí)間,找不到解決我問(wèn)題的辦法。我們將SQLAlchemy與MySQL一起用于我們的項(xiàng)目,我們多次遇到可怕的錯(cuò)誤:1213, 'Deadlock found when trying to get lock; try restarting transaction'.
在這種情況下,我們最多嘗試重新啟動(dòng)事務(wù)三次。
我已經(jīng)開(kāi)始編寫(xiě)一個(gè)decorator來(lái)實(shí)現(xiàn)這一點(diǎn),但是我不知道如何在失敗之前保存會(huì)話狀態(tài),然后在失敗之后重試相同的事務(wù)?(因?yàn)槊慨?dāng)引發(fā)異常時(shí),SQLAlchemy都需要回滾)
到目前為止我的工作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
總結(jié)
以上是生活随笔為你收集整理的mysql 重试_重试MySQL/SQLAlchemy的死锁的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: “华为擎云”品牌发布 华为终端商用市场驶
- 下一篇: 问界汽车将升级HarmonyOS 3 带