2014-12-06 163 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为您的删除问题。