我正在使用Spring boot创建一个restful,用于将数据保存到数据库。 现在,当您同时调用此服务时遇到问题,因为先前的请求尚未完成,因此我的数据在数据库中重复了。
我生成一个像00001这样的数字,我需要从数据库中运行它
但是当数据库中同时请求时,将00002保存为2条记录。
@Transactional
public List<Object> saveData(String data) {
//validate data
//Get Last Data
//set prepare data
//save data
int idLatest = Integer.parseInt(getLatest("7", "8"));
List<Object> objects = autoGenarateEntity(idLatest);
Repository.save(Object);
}
public String getLatest(String idFirst, String idSecond){
Optional<Object> running = Repository.findByBIdStartingWithOrderByBIdDesc(idFirst, idSecond).stream().findFirst();
if(running.isPresent()){
String bId =running.get();
return bId.getBId();
}else {
return "70000000";
}
}
public List<Object> autoGenarateEntity(int idLatest){
List<Object> objects = new ArrayList<>();
IntStream.range(1, 5 + 1).forEach(i -> {
Object obj = new Object();
obj.setBId(Integer.toString(idLatest + i));
obj.add(Object);
});
return objects;
}
答案 0 :(得分:0)
以下是在这种情况下可以执行的选项:
1。)对值为00001的列具有唯一的键约束。因此,试图提交相同值的第二个事务将回滚。 然后,您可以使用Spring-Retry机制执行具有更新后值的第二笔交易
2。)使用自定义序列生成器增加值,而不是自己处理。
答案 1 :(得分:0)
我对此有解决方案
@Transactional(isolation = Isolation.SERIALIZABLE)
并使用spring retry