Mysql子查询锁定



如果我有一个类似的查询

UPDATE table_x SET a = 1 WHERE id = ? AND (
    SELECT SUM(a) < 100 FROM table_x
)

  • 可以同时进行数百次这样的查询
  • 我需要确定a永远不会超过100

我需要锁定表吗?还是table_x会自动锁定,因为它是一个子查询?

假设这是innodb表,则将具有行级锁定。因此,即使它们一次发生100个,也只有一个事务能够获取这些行的锁,并在下一个事务发生之前完成处理。更新和子查询的事务处理方式没有区别。对于innodb引擎来说,这都是一个事务,而不是两个单独的事务。

如果您想了解运行查询时幕后发生了什么,请在查询运行时在命令行中键入"show engine innodb status"。

以下是一个关于所有这些输出意味着什么的精彩演练。

若您想了解更多关于Innodb和行级锁定的信息,请点击此处的链接。

最新更新