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

@Transaction how to get updated via multiple threads

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

@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() 默认为 return some。 预期结果是 - some-name-name 但我最后看到的是 some-name.

问题似乎是 findbyId 由 2 个不同的线程同时执行并使该实体处于此状态。

如何处理?

您应该使用带重试的乐观锁定来确保两个更新最终都提交。

看看这个问题:Spring Optimistic Locking:How to retry transactional method till commit is successful

关键是使用Spring重试捕获乐观锁异常