如果我有一个类似的查询
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和行级锁定的信息,请点击此处的链接。