@Transaction如何通过多个线程获得更新



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

@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并捕获乐观锁定异常。

最新更新