MySQL InnoDB是否使用READ_COMMITTED隔离级别锁定多行?

时间:2015-05-22 08:06:40

标签: mysql locking innodb rowlocking read-committed

我在使用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 隔离水平?

1 个答案:

答案 0 :(得分:1)

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

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

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

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

相关问题