【问题标题】:Does MySQL InnoDB locks multiple rows with READ_COMMITTED isolation level?MySQL InnoDB 是否使用 READ_COMMITTED 隔离级别锁定多行?
【发布时间】:2015-08-04 04:01:24
【问题描述】:

我在使用 MySQL InnoDB 解决 LOCK WAIT TIMEOUT EXCEED 错误时遇到了麻烦。

我已经完成了this article,它说如果我们使用隔离级别READ_COMMITTED,那么我的更新查询应该只锁定那些匹配WHERE 条件的行,但这对我不起作用,因为我得到@ 987654325@ 该查询的行锁。

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:

为什么我的更新查询条件只匹配 一行 并且我使用 READ_COMMITED 隔离级别时锁定了 54 行?

【问题讨论】:

    标签: mysql locking innodb rowlocking read-committed


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-09
      • 1970-01-01
      • 2016-01-18
      • 2015-08-19
      • 2010-12-04
      • 1970-01-01
      • 2018-06-27
      相关资源
      最近更新 更多