【发布时间】:2010-05-11 07:29:35
【问题描述】:
考虑这种情况:
- 开始交易
- 使用 auto_increment 键将 20 条记录插入表中
- 获取第一个插入ID(假设它是
153) - 更新该表中
id >= 153所在的所有记录 - 提交
第 4 步安全吗?
也就是说,如果另一个请求几乎同时到来,并且在上面的第 2 步之后,但在第 4 步之前,又插入了 20 条记录,会不会出现竞态条件?
【问题讨论】:
-
为什么你会有一个单独的更新步骤,而不是一开始就插入正确的数据?那是相当奇怪的。如果您首先插入正确的数据,则无需担心“竞争条件”。更新
WHERE id > 153也是一个很奇怪的查询。自动增量 id 对它们没有逻辑,因此您永远不应该(据我所知)仅基于 id 进行更新。最后,我不知道任何“第一个插入 id”功能。 -
@ButtleButkus dev.mysql.com/doc/refman/5.0/en/… "如果您使用单个 INSERT 语句插入多行,LAST_INSERT_ID() 将返回为第一个插入行生成的值"
-
你对 LAST_INSERT_ID() 的看法是对的,但这并没有改变这样一个事实,即问题似乎是关于假设情况,如果遵循基本的数据库结构和过程,这种情况永远不会存在。为什么您的更新标准永远是无意义的 id 的值?我想不出任何理由。我不会称其为“竞争条件”,因为它是荒谬的。当您可以插入正确的值开始时,为什么要在插入后立即更新?这些才是这个问题没有意义的真正原因。
-
我真的不记得最初的问题(大约 3 年前),但我认为这是必要的。 :) 不管推理如何,我相信这个问题的基本原则是合法的——在该事务中,在插入插入期间插入的记录是否可以“看到”并受到更新的影响?
标签: mysql transactions race-condition