Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 如何防止StaleObjectStateException:行被另一个事务更新或删除?_Hibernate_Spring Mvc_Jpa - Fatal编程技术网

Hibernate 如何防止StaleObjectStateException:行被另一个事务更新或删除?

Hibernate 如何防止StaleObjectStateException:行被另一个事务更新或删除?,hibernate,spring-mvc,jpa,Hibernate,Spring Mvc,Jpa,我能在SO找到一些与这个主题相关的帖子,但我找不到一个与我的需求相关的帖子 我正在使用SpringMVC+JPA(Hibernate)作为一个网站。在控制器中: @RequestMapping(value="deleteMyRecord", method = RequestMethod.GET) public void deleteQuestionAndUpdateLaterQuestions(HttpServletRequest request, @RequestParam(

我能在SO找到一些与这个主题相关的帖子,但我找不到一个与我的需求相关的帖子

我正在使用SpringMVC+JPA(Hibernate)作为一个网站。在控制器中:

@RequestMapping(value="deleteMyRecord", method = RequestMethod.GET)
public void deleteQuestionAndUpdateLaterQuestions(HttpServletRequest request, 
        @RequestParam(value = "id", required = true) Long qid,
        Model model, Map<String, Object> map) {
    myService.deleteMyRecord(id);
}
只有在某些情况下,对
myService.deleteMyRecord(id)
的调用才会生成StaleObjectStateException。我尽了很大的努力,终于发现了事情是怎么发生的。这是如何做到的:当网站运行缓慢时,用户可能会不耐烦,并单击删除按钮两次。当两个请求都到达服务层,并且第一个请求尚未完成删除记录时,当第二个请求在第一个请求调用它之后调用
myService.deleteMyRecord(id)
时,会发生此异常

我现在正在寻找解决办法。在客户端,我可以在单击delete按钮后禁用它。我可以在服务层或控制器中做什么来防止此异常


谢谢

在服务器端您可能做不了多少。这就像乐观并发异常一样。您的服务足够智能,可以重试您的操作(并将删除已删除的记录视为成功),或者您只需向客户端提供有意义的消息,说明对象状态已更改并触发某种刷新以显示最新状态。还有其他选择,如在请求中附加某种请求ID(因此,在您的情况下,不耐烦的第二次删除请求将具有相同的请求ID)这让你可以忽略第二个/等到第一个完成。这涉及到更大的设计更改,你仍然需要处理从两个不同会话中删除相同记录的情况Adrian,非常感谢你的输入!!!Adrian,我不确定是否还有其他解决方案。如果我们等几天,没有进一步的通信ents或answers,您介意将您的响应作为答案发布吗?我会选择它。在服务器端您可能做不了多少。这就像乐观并发异常一样。您的服务足够智能,可以重试您的操作(并将删除已删除的记录视为成功),或者您只需向客户端提供有意义的消息,说明对象状态已更改,并触发某种刷新以显示最新状态。还有其他选择,如在请求中附加某种请求ID(因此,在您的情况下,不耐烦的第二次删除请求将具有相同的请求ID)这让你可以忽略第二个/等到第一个完成。这涉及到更大的设计更改,你仍然需要处理从两个不同会话中删除相同记录的情况Adrian,非常感谢你的输入!!!Adrian,我不确定是否还有其他解决方案。如果我们等几天,没有进一步的通信你介意将你的回答作为答案发布吗?我会选择它。
@Override
public void deleteMyRecord(Long id) { 
    myRecordRepository.delete(id); //using Spring Data
}