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

时间:2016-07-06 01:32:59

标签: hibernate spring-mvc jpa

我能够在SO上找到与此主题相关的一些帖子,但我无法找到与我的需求相关的帖子。

我在网站上使用Spring MVC + 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);
}

服务层方法:

@Override
public void deleteMyRecord(Long id) { 
    myRecordRepository.delete(id); //using Spring Data
}

只有SOMETIMES,对myService.deleteMyRecord(id)的调用会生成StaleObjectStateException。我努力了,终于发现它是怎么回事。这是这样的:当网站很慢时,用户可能会不耐烦并单击删除按钮两次。当两个请求都到达服务层并且第一个请求尚未完成删除记录时,第二个请求在第一个请求调用它之后调用myService.deleteMyRecord(id)时会发生此异常。

我正在寻找解决方案。在客户端,我可以在单击后禁用删除按钮。我可以在服务层或控制器中做些什么来防止此异常?

谢谢!

0 个答案:

没有答案