我有以下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