[英]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
異常和@Transactional
的rollbackFor
屬性的更具體的異常。
看一下這篇文章 。
您為什么要為單個插入/保存操作進行交易。 如果保存失敗,將不會保存,因此沒有回滾的內容
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.