触发场景

  • JPA (Hibernate) (Spring Boot 2)
  • MySQL 隔离级别不为 Serializable
  • 实体没有使用 @DynamicUpdate 注解
  • 至少存在两个接口频繁执行:先查询再更新同一个实体的操作(不管更新的字段是否相同)

问题描述

导致第二类更新丢失。关于第二类更新丢失参见:该文

解决办法

场景一:如果两个接口不是更新同一个字段

  • entity.setXxx 改为编写 HQL 的调用,指定更新有改动的字段
  • 添加 @DynamicUpdate 注解,参考:该文

场景二:如果两个接口同时更新同一个字段

  • 悲观锁 select for update
  • 乐观锁 update set xxx = ? where id = ? and xxx = select 到的数据