我已经面对这个问题有一段时间了。
@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通过2个不同的线程来更新实体。我只看到实体中的最后一次更新。
即-
entity.getName()
默认返回some
。预期结果为-some-name-name
但我最后看到的是some-name
。
问题似乎是findbyId被两个不同的线程同时执行,并使该实体处于这种状态
如何处理?
您应该使用乐观锁定与重试,以确保两个更新最终提交。
看一下这个问题:Spring乐观锁定:如何重试事务方法直到提交成功
关键是使用Spring Retry并捕获乐观锁定异常。