SQL中同时执行多条同数据UPDATE查询的执行机制及结果咨询
并发UPDATE语句的执行逻辑与结果解析
嘿,这个问题在数据库并发场景里太常见了,我给你掰扯明白:
核心疑问:并发UPDATE会排队执行吗?
绝大多数主流关系型数据库(比如MySQL、PostgreSQL、SQL Server这些),都会通过行级排他锁来处理同一行数据的并发更新请求,逻辑是这样的:
- 当第一条
UPDATE Users set Address='abc' where UserID=2开始执行时,数据库会立刻给UserID=2的这一行加上排他锁——意思就是,这行数据现在只能被这条语句修改,其他想碰它的更新请求都得等着 - 第二条
UPDATE Users set Address='xyz' where UserID=2发起后,因为目标行已经被锁了,它会进入等待队列,直到第一条UPDATE执行完、释放锁之后,才能继续执行 - 简单说:针对同一行的并发UPDATE请求,一定会排队依次执行,不会同时修改同一行数据
你的示例场景:最终Address会是啥?
回到你的例子,两条针对同一行的UPDATE同时发起,最终的Address值完全取决于哪条语句先拿到锁并执行完成:
- 如果
set Address='abc'先抢到锁,它会把地址改成'abc',然后释放锁;接着set Address='xyz'执行,把地址改成'xyz'——最终结果就是'xyz' - 如果反过来,
set Address='xyz'先执行,那它改完之后,set Address='abc'再执行的话,最终结果就是'abc'
这里要提一句:数据库里的“同时”其实是相对概念,数据库的请求调度器总会给这些请求排个先后顺序,绝对的“同时执行”在实际执行层面是不存在的,总有一条会先跑。
额外小补充:如果更新不同字段呢?
要是两条UPDATE是修改同一行的不同字段(比如一条改Address,一条改PhoneNumber),大部分数据库还是会用行级锁,所以依然会排队执行;不过有些数据库在特定隔离级别下可能有更细粒度的锁,但核心逻辑还是保证同一行的修改不会出现冲突。
内容的提问来源于stack exchange,提问作者User1793
相关产品推荐
相关产品推荐

