当我选择更新的开始行和结束行时,mysql会锁定一系列行吗



假设我有一个有两列的表。其中一个名为id,这是它的主键。另一种称为value。此表有10行,如下所示。

1 'A'
2 'B'
3 'C'
4 'D'
5 'E'
6 'F'
7 'G'
8 'H'
9 'I'
10 'J'

然后我应用一个类似SELECT * FROM table WHERE id IN (1, 10) FOR UPDATE;的查询,我想知道之后会发生什么。我记得有一次我从博客上读到它,它会锁定所有10行。但我不能再重复了。这个问题真的存在吗?或者只是我记错了。

大多数DBMS默认隔离级别为读取提交,因此,如果不采取应对措施,您将面临以下问题:

  • 不可重复读取
    ,因此:
    • 丢失更新
    • 读取偏斜
    • 写入偏斜
    • 幻影读取

幻影读取现象是您在这种情况下所担心的,这意味着,例如,如果稍后在事务期间在update语句中使用完全相同的where子句,则可能会影响更多/更少或完全不同的行集。

我已经阅读了手册帮助:http://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html

那么我确信我所做的不会锁定一系列行。只有选定的行将被锁定。现在我觉得我以前读的博客是错的。

谢谢。

最新更新