超过READ COMMITTED锁定等待超时

时间:2014-12-06 02:19:35

标签: java mysql sql

我有一个关于事务隔离级别和mysql锁定的问题。

我有一个查询不断收到锁定超时错误:

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

查询基本上尝试删除具有特定date_id的记录。顺便说一句,date_id也被编入索引。但大多数时候,没有记录匹配,即它不会删除任何内容。

经过一番调查后,我发现它可能是由一个罪魁祸首长期运行的查询引起的,该查询在同一个表上进行范围选择。然而,令我困惑的是两个事务都在“READ COMMITTED”的隔离级别运行。所以我不知道为什么需要锁定以及它为什么会超时(特别是考虑到没有匹配的记录要删除)

提前谢谢!

1 个答案:

答案 0 :(得分:0)

事务隔离"读取已提交"是一个契约:数据库承诺只读取已提交的数据并将未提交的数据保留在事务之外。锁定超时错误是运行时错误:数据库尝试更新数据但是找不到这样做的好时机(请参阅MySQL参考手册中的" innodb_lock_wait_timeout"提到here)。即使没有要删除的数据,数据库也需要找到一个断言的时刻。

事务隔离"读取已提交"已经提高了数据库找到更新数据的好机会(例如参见here),但它无法阻止其他查询/事务锁定整个表("全表扫描&# 34;像你的罪魁祸首查询可能会这样做。

更多搜索确实会显示possible solution您的删除问题。