2016-09-30 99 views
3

在日誌中我有一個與此相關的查詢死鎖:MySQL的插入

INSERT INTO `driver_state` (id, state) 
    VALUES('83799','waiting') 
ON DUPLICATE KEY UPDATE  
    state = IF(state = 'active', state, VALUES(state)); 

確切錯誤:

ER_LOCK_DEADLOCK: Deadlock found when trying to get lock; try restarting transaction 

我試圖原因,並瞭解如何查詢可以甚至可能導致僵局,但還沒有走得很遠。

表結構

CREATE TABLE IF NOT EXISTS `driver_state` (
    `id` int(11) NOT NULL, 
    `state` enum('inactive','waiting_orders','has_order','busy') DEFAULT NULL, 
PRIMARY KEY (`id`) 
) ENGINE=MEMORY DEFAULT CHARSET=utf8; 

在這種情況下,我們使用MEMORY表,但是InnoDB的具有相同的鎖定問題。

表獲取大量這些插入重複鍵查詢和選擇查詢(所有選擇查詢都非常快速和優化)。交易不會在任何地方使用,也不能手動鎖定等。

請問您可以提出任何可能導致這種情況的想法嗎?

回答

-1

爲什麼在ON DUPLICATE KEY UPDATE中有IF語句?

我認爲你的問題在那裏。它看起來像是在說如果有重複鍵,根據狀態的值來設置狀態值。

ON DUPLICATE KEY UPDATE state ='waiting'有什麼問題?

我會試試看看死鎖是否消失,以確認它是由IF造成的。

我也會在這裏更詳細地解釋你要做的事情。