我已经面对这个问题已有一段时间了。
@Service
public class SomeService{
@Autowired
private Repo repo;
@Transactional
public void update(int id){
repo.findById(id).ifPresent(entity -> entity.setName(entity.getName() + "-name"));
}
}
我的问题是-通常2个不同的线程传递相同的ID来更新实体。我只看到实体中的最新更新。
那是 -
entity.getName()
默认情况下将返回some
。预期的结果是-some-name-name
但我最终看到的是some-name
。
问题似乎是findbyId由2个不同的线程同时执行,并使该实体处于此状态。
如何处理呢?
您应该对重试使用乐观锁定,以确保两个更新都最终提交。
看一下这个问题:Spring Optimistic Locking:如何在提交成功之前重试事务方法
关键是使用Spring Retry并捕获乐观锁定异常。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句