我有以下SQL語句:處理MySQL的僵局
self.cursor.execute('''INSERT INTO main_iteminstance (...) VALUES (...)''')
此操作運行在兩個小時的腳本數百萬次。但是,大約每十個腳本運行一次,就會發生死鎖:
OperationalError: (1205, 'Lock wait timeout exceeded; try restarting transaction')
我應該如何處理?我的想法是做到以下幾點 -
while True:
try:
self.cursor.execute('''INSERT INTO main_iteminstance (...) VALUES (...)''')
except MySQLdb.OperationalError:
continue
else:
break
這是最好的使用模式?還是有更好的方法來做到這一點?
如何在OperationalError下使用retries參數並在失敗時增加它? – spicyramen
@ spicyramen你能解釋一下你的意思嗎? – David542
當腳本失敗該特定事務並達到OperationalError時,因爲您正在使用continue並將控件返回到while循環的開始處,所以當我們擊中該異常時,我將使用retries參數標誌,並且將嘗試SQL事務X的數量之前認爲它是一個失敗。其他選項將被置入睡眠狀態,然後重試。 – spicyramen