两个同时执行的特定UPDATE查询是否均可返回1行更新?
问题解答
嘿,这个问题问到点子上了!答案很明确:不可能两个客户端都收到“1 row has been updated”的反馈,必然只有一个客户端能得到1行更新的结果,另一个只能拿到“0 rows has been updated”的返回。
这背后是数据库的并发控制机制在起作用,简单拆解下逻辑:
- 当第一个客户端执行那条
UPDATE table SET column = 'one' WHERE id = 0 AND column = 'zero'语句时,数据库会立刻定位到符合条件的行,给这一行加上排他锁——就像给数据上了个“正在修改,其他人别动”的专属锁。 - 这时候第二个客户端的
UPDATE语句过来尝试修改同一行,发现锁已经被占,只能进入等待状态,直到第一个客户端的操作完成。 - 等第一个客户端提交事务后,那行数据的
column值已经变成了'one'。此时第二个客户端的UPDATE终于能执行条件判断,但column='zero'的条件已经不满足,自然找不到要更新的行,只能返回0行。
就算是用了乐观锁这类依赖版本校验的机制,两个客户端同时读到初始的'zero'值,但第一个提交成功后,第二个提交时会检测到数据已被修改,更新直接失败,结果还是只有一个能成功。
说白了,数据库的核心职责之一就是保证数据一致性,这种“同一行数据被两个并发请求同时修改成功”的情况,正是它要严格避免的场景。
内容的提问来源于stack exchange,提问作者jcoig
相关产品推荐
相关产品推荐

