2016-01-06 46 views
1

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

这是最好的使用模式?还是有更好的方法来做到这一点?

+0

如何在OperationalError下使用retries参数并在失败时增加它? – spicyramen

+0

@ spicyramen你能解释一下你的意思吗? – David542

+1

当脚本失败该特定事务并达到OperationalError时,因为您正在使用continue并将控件返回到while循环的开始处,所以当我们击中该异常时,我将使用retries参数标志,并且将尝试SQL事务X的数量之前认为它是一个失败。其他选项将被置入睡眠状态,然后重试。 – spicyramen

回答

0

你能把你的价值观打破成这样吗?

INSERT INTO main_item_instance (...) VALUE (...), (....), .... 

您是否需要做单独的插入操作,或者您可以在脚本的末尾做一个大插入操作吗?

+0

是的,它最终不可能做到这一点。这是一次一个项目/文件的“流式摄取”。 – David542

+0

我应该发表评论,而不是回答 –