簡體   English   中英

如果在控制器中引發異常,則Spring JPA回滾事務

[英]Spring JPA rollback transaction if Exception thrown in controller

我有一個帶有大量Spring MVC控制器的Webapp。 這些控制器與具有JPA,實體和存儲庫的數據庫進行交互。

我想確定的是,當控制器方法由spring mvc處理時,如果在此過程中引發任何異常,則在該方法期間附加的所有數據庫更改都將回滾。

這里是一個例子:

<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;
            }
        });
}

這不是最佳的設計,但是如果需要,可以嘗試使用帶有throw異常和@TransactionalrollbackFor屬性的更具體的異常。

看一下這篇文章

您為什么要為單個插入/保存操作進行交易。 如果保存失敗,將不會保存,因此沒有回滾的內容

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM