【问题标题】:Spring JPA rollback transaction if Exception thrown in controller如果在控制器中抛出异常,则 Spring JPA 回滚事务
【发布时间】:2017-03-17 03:55:51
【问题描述】:

我有一个带有大量 spring mvc 控制器的 webapp。 这些控制器通过 JPA、实体和存储库与数据库交互。

我想确保当一个控制器方法由 spring mvc 处理时,如果在该过程中抛出任何异常,在该方法期间附加的所有 DB 更改都会回滚。

这里是一个例子:

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>

控制器

@Controller
public class JpaTest {

    @Autowired
    GroupRepository groupRepository;

    @RequestMapping(value = "/{langId}/jpatest", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody
    @Transactional
    public String test() throws Exception {
        Group group = new Group();
        group.setName("jpaTest");
        groupRepository.save(group);
        throw new Exception("MY EXCEPTION ");
    }
}

我希望该组没有添加到数据库中!

我希望@Transactional 能成功,但不会。

我加了

  <tx:annotation-driven transaction-manager="transactionManager" />

但是没有效果。 有没有办法简单地做到这一点?

或者我可以封装我的调度程序 Servlet 以进行超级事务管理,就像我们对 jeeves 所做的那样:

protected void doDispatch(final HttpServletRequest request, final HttpServletResponse response) throws Exception {
    JeevesDispatcherServlet.super.doDispatch(request, response);

    TransactionManager.runInTransaction("jeevesDispatchServlet", getWebApplicationContext(),
        TransactionManager.TransactionRequirement.CREATE_ONLY_WHEN_NEEDED,
        TransactionManager.CommitBehavior.ONLY_COMMIT_NEWLY_CREATED_TRANSACTIONS,
        false, new TransactionTask<Void>() {
            @Override
            public Void doInTransaction(TransactionStatus transaction) throws Throwable {
                JeevesDispatcherServlet.super.doDispatch(request, response);

                return null;
            }
        });
}

【问题讨论】:

    标签: java spring-mvc spring-data-jpa transactional


    【解决方案1】:

    这不是最好的设计,但如果需要, 您可以使用throw 子句和@TransactionalrollbackFor 属性尝试更具体的例外。

    看看这个post

    【讨论】:

      【解决方案2】:

      您为什么要为单个插入/保存操作进行事务处理。如果保存失败,它将不会被保存,所以没有什么可以回滚

      【讨论】:

      • 这应该是一条评论
      猜你喜欢
      • 2022-07-22
      • 2019-04-30
      • 2015-10-03
      • 1970-01-01
      • 1970-01-01
      • 2020-09-24
      • 1970-01-01
      • 2012-04-14
      • 2016-08-14
      相关资源
      最近更新 更多