gpt4 book ai didi

mysql - 如何处理 spring-boot hibernate 问题中的当前更新?还需要使应用程序可扩展

转载 作者:行者123 更新时间:2023-11-29 16:20:47 24 4
gpt4 key购买 nike

项目类型:- Spring-boot JPA 项目

嗨,我有下面的 Rest 服务,它会增加数据库中的数字。

  @RestController
public class IncrementController {

@Autowired
MyNumberRepository mynumberRepository;

@GetMapping(path="/incrementnumber")
public String incrementNumber(){
Optional<MyNumber> mynumber = mynumberRepository.findById(1);
int i = mynumber.get().getNumber();

System.out.println("value of no is "+i);
i = i+1;
System.out.println("value of no post increment is "+i);
mynumber.get().setNumber(i);

MyNumber entity = new MyNumber();
entity.setId(1);
entity.setNumber(i);

mynumberRepository.save(entity);
return "done";
}
}

实体如下:-

    @Entity
@Table(name = "my_number")
public class MyNumber {

@Id
private Integer id;

private Integer number;

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public Integer getNumber() {
return number;
}

public void setNumber(Integer number) {
this.number = number;
}
}

下面是存储库:-

   public interface MyNumberRepository extends JpaRepository<MyNumber, Integer>{

}

当我顺序调用增量编号时,该服务运行良好,但是当并发线程调用增量服务时,我会得到不一致的结果。我该如何处理这种情况?

还必须将应用程序部署在多个位置并连接到同一数据库。即可扩展性问题。

谢谢,拉胡尔

最佳答案

您必须使用悲观锁。这将发出 SELECT FOR UPDATE 并锁定事务的行,并且另一个事务不可能覆盖该行。

public interface MyNumberRepository extends JpaRepository<MyNumber, Integer> {

@Lock(LockModeType.PESSIMISTIC_WRITE)
Optional<MyNumber> findById(Integer id);
}

然后您必须通过添加 @Transactional 使 REST 方法具有事务性

@RestController
public class IncrementController {

@Autowired
MyNumberRepository mynumberRepository;

@Transactional
@GetMapping(path="/incrementnumber")
public String incrementNumber(){
Optional<MyNumber> mynumber = mynumberRepository.findById(1);
int i = mynumber.get().getNumber();

System.out.println("value of no is "+i);
i = i+1;
System.out.println("value of no post increment is "+i);
mynumber.get().setNumber(i);

MyNumber entity = new MyNumber();
entity.setId(1);
entity.setNumber(i);

mynumberRepository.save(entity);
return "done";
}
}

关于mysql - 如何处理 spring-boot hibernate 问题中的当前更新?还需要使应用程序可扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54513478/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com