2014-02-25 147 views
0

我正在使用python調用mysql中的表並執行查詢。我得到一個錯誤:超出鎖定等待超時;嘗試使用python更新mysql表時嘗試重新啓動事務錯誤

_mysql_exceptions.OperationalError: (1205, 'Lock wait timeout exceeded; try restarting transaction') 

tbl_1是一個表中,我必須更新isprocessed列。

cursor.execute('UPDATE tbl_1 SET isprocessed=1 where name='+body) 
cursor.close() 
cursor1 = db.cursor() 
cursor1.execute('SELECT name,height,age,weight from tbl_1 where name='+body) 

正在取消消息隊列中的值。如果我運行的代碼沒有UPDATE查詢其運行正常。我認爲cursor.close將解決問題,但它沒有。我也重啓了mysql。我經歷了類似的問題,但他們都沒有解決我的問題。任何幫助表示讚賞。

我已經設置innodb_lock_wait_timeout從50到63000

+2

大膽猜測:'cursor.commit()的''而不是cursor.close()' – isedev

+0

COMMIT將有助於,但沒有解釋它。兩個遊標是否從同一個連接對象創建?您的隔離級別設置爲SERIALIZABLE? – geertjanvdk

+0

@geertjanvdk是從相同連接object.isolation級別創建的遊標是SERIALIZABLE – sau

回答

0

這是面臨的原因有很多共同的問題。

  1. 當您運行程序(或文件)時,請勿在其他終端中打開MYSQL。這可能會導致讀寫衝突。
  2. 如果您使用django以及MYSQL直接執行(使用遊標),請確保您使用以下命令提交事務:{your_connection_object}.commit()。例如:self.conn.commit()

調試命令如下(閱讀更多關於他們,如果你是新來他們):

INNODB監視器輸出:

SHOW ENGINE INNODB STATUS\G 

進程當前正在運行:

Show processlist; 

殺死特定的過程:

kill *process_id*; 

當前運行的事務:

SELECT * FROM `information_schema`.`innodb_trx` ORDER BY `trx_started`; 
相關問題