我在使用MySQL InnoDB解决LOCK WAIT TIMEOUT EXCEED
错误时遇到了麻烦。
我已经完成了this article并且它说如果我们使用隔离级别READ_COMMITTED
,那么我的更新查询应该只锁定那些符合WHERE
条件的行,但这不适用于我正在为该查询获取54
行锁。
SHOW ENGINE INNODB STATUS;
的结果如下:
---TRANSACTION 8AE162608, ACTIVE 102 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 56 lock struct(s), heap size 6960, 54 row lock(s), undo log entries 135
MySQL thread id 18013536, query id 164766412915 localhost MyDataDb Updating
update stock set quantity = quantity + -1, last_updated_dts='2015-01-19 00:08:23', last_updated_by='vishal' where location = 1 and product_id = '123'
------- TRX HAS BEEN WAITING 98 SEC FOR THIS LOCK TO BE GRANTED:
为什么我的 54 行被锁定,而我的更新查询条件仅匹配一行而我正在使用 READ_COMMITED
隔离水平?
答案 0 :(得分:1)
事务隔离级别READ_COMMITTED
有一个承诺:数据库承诺只读取已提交的数据,并且将尚未提交的数据保留在事务之外。
锁定超时错误是运行时错误:数据库尝试更新数据,但无法找到这样做的好时机(请参阅MySQL参考手册中的innodb_lock_wait_timeout
提到的here)。即使没有要修改的数据,数据库也需要找到一个断言的时刻。
事务隔离级别READ_COMMITTED
已经提高了数据库找到更新数据的好机会(例如,参见here),但它无法阻止其他查询/事务锁定整个表(像你的罪魁祸首查询可能做的全表扫描)。
更多搜索确实会显示possible solution您的删除问题。