我有一个关于事务隔离级别和mysql锁定的问题。
我有一个查询不断收到锁定超时错误:
java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction
查询基本上尝试删除具有特定date_id的记录。顺便说一句,date_id也被编入索引。但大多数时候,没有记录匹配,即它不会删除任何内容。
经过一番调查后,我发现它可能是由一个罪魁祸首长期运行的查询引起的,该查询在同一个表上进行范围选择。然而,令我困惑的是两个事务都在“READ COMMITTED”的隔离级别运行。所以我不知道为什么需要锁定以及它为什么会超时(特别是考虑到没有匹配的记录要删除)
提前谢谢!
答案 0 :(得分:0)
事务隔离"读取已提交"是一个契约:数据库承诺只读取已提交的数据并将未提交的数据保留在事务之外。锁定超时错误是运行时错误:数据库尝试更新数据但是找不到这样做的好时机(请参阅MySQL参考手册中的" innodb_lock_wait_timeout"提到here)。即使没有要删除的数据,数据库也需要找到一个断言的时刻。
事务隔离"读取已提交"已经提高了数据库找到更新数据的好机会(例如参见here),但它无法阻止其他查询/事务锁定整个表("全表扫描&# 34;像你的罪魁祸首查询可能会这样做。
更多搜索确实会显示possible solution您的删除问题。