如何同时处理通话请求

时间:2018-12-25 06:49:57

标签: java spring-boot

我正在使用Spring boot创建一个restful,用于将数据保存到数据库。 现在,当您同时调用此服务时遇到问题,因为先前的请求尚未完成,因此我的数据在数据库中重复了。

我生成一个像00001这样的数字,我需要从数据库中运行它

  1. 我从数据库获得最后一个
  2. 然后00001 + 1 = 00002
  3. 保存到数据库

但是当数据库中同时请求时,将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;
}

2 个答案:

答案 0 :(得分:0)

以下是在这种情况下可以执行的选项:

1。)对值为00001的列具有唯一的键约束。因此,试图提交相同值的第二个事务将回滚。 然后,您可以使用Spring-Retry机制执行具有更新后值的第二笔交易

2。)使用自定义序列生成器增加值,而不是自己处理。

答案 1 :(得分:0)

我对此有解决方案

 @Transactional(isolation = Isolation.SERIALIZABLE)

并使用spring retry