方法調用:
1. Struts操作
2.服務類方法(通過@Transactional註解)
3. Xfire的web服務調用如何防止JPA回滾事務?
一切,包括支柱(DelegatingActionProxy)和交易被配置有彈簧。
持久性是使用JPA/Hibernate完成的。
有時web服務會拋出一個未經檢查的異常。我發現這個異常並拋出一個檢查異常。由於Web服務異常更改當前狀態,我不希望事務回滾。我已經註釋這樣的方法:
@Transactional(noRollbackFor={XFireRuntimeException.class, Exception.class})
public ActionForward callWS(Order order, ....) throws Exception
(...)
OrderResult orderResult = null;
try {
orderResult = webService.order(product, user)
} catch (XFireRuntimeException xfireRuntimeException) {
order.setFailed(true);
throw new WebServiceOrderFailed(order);
} finally {
persist(order);
}
}
我仍然得到此異常:當我試着使用JUnit來重現此
org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly
,本次交易未標記爲回滾,它仍然可能進行交易。
如何讓Spring不回滾事務?
這是不正確的。 'noRollbackFor'檢查指定的異常類及其所有子類:http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/transaction/annotation/Transactional.html#noRollbackFor() 此外,默認情況下,檢查異常不會觸發回滾:http://static.springsource.org/spring/docs/2.5.x/reference/transaction.html#transaction-claclarative-attransactional-settings – ChssPly76 2009-11-09 17:08:09
這並不能解釋爲什麼上面的代碼在'WebServiceOrderFailed'上回滾。 – 2009-11-10 07:57:11
我的猜測是WebServiceOrderFailed是一個RuntimeException和上面的代碼('noRollbackFor = {...,Exception。class}')不能有任何效果,因爲Exception是專門處理的(否則,繼承代碼也會忽略RuntimeException,因爲它擴展了Exception)。 – 2009-11-10 08:02:21