2014-12-06 164 views
0

我有一個關於事務隔離級別和在mysql中鎖定的問題。READ COMMITTED超出鎖等待超時

我有一個查詢弟妹鎖定超時錯誤:

java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction 

的查詢基本上嘗試與特定DATE_ID刪除記錄。順便說一句,date_id也是索引。但大多數情況下,沒有記錄匹配,即它不會刪除任何內容。

經過一番調查後,我發現它可能是一個罪魁禍首長期運行的查詢,它在同一張桌子上做了一個範圍選擇。然而,我感到困惑的是事務處理在隔離級別「READ COMMITTED」。所以我不知道爲什麼需要一個鎖,爲什麼它可能會超時(特別是考慮沒有匹配的記錄刪除)

先謝謝您!

+0

使用'SHOW INNODB STATUS'來查看你的SQL塊是什麼類型的? – 2014-12-06 09:44:55

+0

您是否使用InnoDb表或MyIsam表?在MyIsam編寫器中,阻止讀取器,反之亦然,一個簡單的SELECT語句將鎖定查詢中涉及的所有表,並阻止編寫器。 – krokodilko 2014-12-06 11:17:30

回答

0

事務隔離「讀取已提交」是一個契約:數據庫承諾只讀取已提交的數據並將尚未提交的數據保留在事務之外。鎖定超時錯誤是一個運行時錯誤:數據庫嘗試更新數據,但找不到合適的時機(請參閱MySQL參考手冊中提到的here中的「innodb_lock_wait_timeout」)。即使沒有要刪除的數據,數據庫也需要及時發現這一點。

事務隔離「讀取已提交」已經提高了數據庫找到更新數據的好時機的機會(例如參見here),但它不能阻止其他查詢/事務鎖定整個表(「全表掃描」就像你的罪魁禍首查詢可能)。

更多搜索結果顯示爲possible solution爲您的刪除問題。