0

我在解决LOCK WAIT TIMEOUT EXCEEDMySQL InnoDB 错误时遇到了麻烦。

我已经阅读了这篇文章,它说如果我们使用隔离级别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

4

1 回答 1

1

事务隔离级别READ_COMMITTED有一个承诺:数据库承诺只读取已提交的数据并将尚未提交的数据排除在事务之外

锁定超时错误是运行时错误:数据库尝试更新数据但找不到这样做的好时机(请参阅MySQL 参考手册innodb_lock_wait_timeout中提到的此处)。即使没有要修改的数据,数据库也需要及时找到一个时间来断言。

事务隔离级别READ_COMMITTED已经提高了数据库找到更新数据的好时机的机会(例如,请参见此处),但它不能阻止其他查询/事务锁定整个表(像您的罪魁祸首查询一样进行全表扫描)。

更多搜索确实显示了删除问题的可能解决方案。

于 2015-05-22T08:13:46.410 回答