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
相关产品推荐
相关产品推荐

