@transaction如何通过多线程更新

oug3syen  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(347)

我面对这个问题已经有一段时间了。

@Service
public class SomeService{

   @Autowired
   private Repo repo;

   @Transactional
   public void update(int id){
     repo.findById(id).ifPresent(entity -> entity.setName(entity.getName() + "-name"));
   }

}

我的问题是-经常有两个不同的线程传递相同的id来更新实体。我只看到实体中的最后一个更新。
就是这样- entity.getName() 默认情况下将返回 some . 预期结果是- some-name-name 但我最后看到的是 some-name .
问题似乎是findbyid由两个不同的线程同时执行,并使该实体保持这种状态。
怎么处理?

js5cn81o

js5cn81o1#

您应该使用带有重试的乐观锁定来确保两个更新最终都提交。
看看这个问题:Spring乐观吗locking:how to 重试事务方法,直到提交成功
关键是使用spring重试并捕获乐观锁定异常。

相关问题