@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重试捕获乐观锁异常
我已经面对这个问题一段时间了。
@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重试捕获乐观锁异常