我面对这个问题已经有一段时间了。
@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由两个不同的线程同时执行,并使该实体保持这种状态。
怎么处理?
1条答案
按热度按时间js5cn81o1#
您应该使用带有重试的乐观锁定来确保两个更新最终都提交。
看看这个问题:Spring乐观吗locking:how to 重试事务方法,直到提交成功
关键是使用spring重试并捕获乐观锁定异常。