当前位置: 首页 > 知识库问答 >
问题:

即使在非事务性方法或控制器中捕获异常,Spring事务性方法也会回滚

澹台华翰
2023-03-14
public void grab(){
    try{
        requestManager.updateRequest();
        requestManager.saveTicket()
    }catch (DataIntegrityViolationException dive) {
       if (dive.getCause() instanceof ConstraintViolationException) {
           LOGGER.error("ConstraintViolationException",dive);
       }
    }
}

在上面的代码中,ConstraintViolationException发生在saveTicket()方法内,saveTicket()内的dao甚至在捕获异常之前就已经回滚了它的事务(这是我所知道的),第一个没有回滚,因为它在另一个事务中。(这是我已经知道的行为)。

当我使用另一个事务性方法调用这两个预览方法(updateRequest()和saveTicket()),当saveTicket()方法中出现ConstraintViolationException时,即使捕捉到异常,也会回滚updateRequest()方法时,我也感到困惑。这是我的代码

 public void grab(){
    try{
        requestManager.grabRequest();
    }catch (DataIntegrityViolationException dive) {
       if (dive.getCause() instanceof ConstraintViolationException) {
           LOGGER.error("ConstraintViolationException",dive);
       }
    }
 }

我所知道的是,这两个方法将在grabRequest()方法中加入相同的事务,但我的问题是,为什么即使我捕获了异常,事务也会回滚?这是否意味着spring使用的代理甚至在我捕获异常之前就已经回滚了事务?

共有1个答案

娄建义
2023-03-14

这是否意味着spring使用的代理甚至在我捕获异常之前就已经回滚了事务?

是的,在JPA/Spring注释中,您可以在@transactional中指定事务管理器必须回滚或不能回滚的异常列表

在默认配置中,Spring Framework的事务基础结构代码仅在运行时未检查异常的情况下标记回滚事务;也就是说,当引发的异常是RuntimeException的实例或子类时。(默认情况下,错误还会导致回滚)。在默认配置中,从事务性方法引发的选中异常不会导致回滚。

 类似资料:
  • 我正在查看一些现有的代码,并想知道在下面的场景中使用Spring的@Transactional注释会发生什么?考虑以下示例: 下面的updateDataBaseItem()方法是常见的,可以从其他非事务性方法和上面的方法调用:

  • 试图收集和理解@事务性注释的要点并越过了一点。因此,在使用事务性注释时,我们需要记住的主要事情是: 事务注释只能应用于公共方法[根据Spring@Transactional属性对私有方法起作用吗? 事务性注释应该应用于具体的类,而不是接口[根据我应该将@transactional annotation放在接口定义还是实现类的位置? 事务注释应应用于服务级别[根据Spring@Transaction

  • 我在一家spring boot hibernate JPA个人项目书店工作。我面临一个问题,即使用@Transactional注释注释的方法即使在运行时异常的情况下也无法回滚事务。我使用的是spring boot版本1.5.1、hibernate版本5、java版本11 下面是bean配置文件代码: 下面是BooK模型文件代码 下面是商店型号代码 下面是BookDaoImpl代码 下面是Store

  • 我在想最近遇到的一个案子。假设我们有一个服务方法,如下所示: 添加用户的工作仅是因为存在。整个方法属于另一个服务,外观如下: 我不确定我是否正确理解为什么添加一个用户是有效的。根据Hibernate文档,只有当实体处于托管状态并且更新发生在单个事务中时,才会发生自动更新。如果我的推理是正确的,就会发生以下步骤: 当请求到来并命中控制器时,实体管理器(Hibernate会话)被附加到当前线程。(?)

  • 我正在使用Spring3.1并编写了我的DAO和服务层(事务性)。 但是,在一个特殊情况下,为了避免惰性初始化异常,我必须创建一个spring mvc请求处理程序method@transactional。但无法将事务附加到该方法。方法名为ModelAndView home(HttpServletRequest request、HttpServletResponse response)。http:/

  • 我正在尝试创建一个事务方法,该方法调用其他几个事务方法以保存一些相互依赖的db实体。如果任何调用失败,我希望事务完全回滚。但是,这不是观察到的行为。这是我的代码: 也有and,但是当事务在第二次调用时失败时,第一个被提交。