如果在控制器中抛出异常,则Spring JPA回滚事务



我有一个带有大量spring mvc控制器的web应用程序。这些控制器通过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" />

但没有效果。有没有一种简单的方法?

或者我可以封装我的dispatcher 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;
            }
        });
}

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

看看这篇文章

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

最新更新