2016-01-06 41 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

我應該發表評論,而不是回答 –