You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot双节点并发更新同主键数据库行的问题咨询

分布式Spring Boot应用并发更新同一条数据库行的问题处理

一、并发更新场景下的实际行为

当两个节点同时发起更新主键为1234L的同一条数据库行请求时,实际行为取决于你使用的数据库引擎:

  • 若使用支持行级锁的引擎(比如MySQL InnoDB),数据库会自动为目标行加行锁:先到达的请求会获取锁并执行更新,后到达的请求会进入等待状态,直到前一个请求释放锁后再执行更新。最终结果是最后执行的更新会覆盖前一个的结果。
  • 由于你明确说明代码不会读取更新后的值再操作,所以不会出现脏读、不可重复读这类问题,仅会出现后更新覆盖前更新的情况。

二、这类请求的处理方案

1. 针对你的场景(接受覆盖、无需回滚)

这种情况完全不需要额外处理:数据库自带的行锁机制已经能保证更新操作的原子性,不会出现数据错乱。既不用在服务层编写额外逻辑,也不需要Spring Boot做特殊配置,只要确保数据库引擎支持行级锁即可。

2. 若需避免更新覆盖(扩展方案)

如果后续需求变更,要防止后更新覆盖前更新的情况,可以实现乐观锁:

  • 在数据表中新增一个version字段(整数类型),每次更新时带上版本条件,比如SQL语句写成:update your_table set column=? where id=1234 and version=?
  • 执行更新后,如果影响行数为0,说明在你发起更新前,该行已经被其他请求修改过,此时可以根据业务需求选择重试或者返回提示。
  • 如果你使用Spring Data JPA,直接给实体类的version字段加上@Version注解,框架会自动帮你处理版本校验和更新逻辑,无需手动编写SQL条件。

三、Spring Boot的配置说明

Spring Boot本身没有专门的配置项直接处理这种并发更新场景,核心依赖的是数据库的锁机制或者开发者自己实现的乐观锁逻辑。如果用JPA的乐观锁,仅需在实体类上添加@Version注解即可,无需额外配置。

内容的提问来源于stack exchange,提问作者user327126

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 15:09:55