我有這樣的代碼:
@Service
public class AService {
public void methodA() {
try {
methodB();
} catch (Exception e) {
methodC(e);
}
}
}
方法B 正在從資料庫中讀取。如果發生在資料庫中,methodC 正在寫入例外。出于某種原因,當方法 B 拋出錯誤時,方法 C 中的寫入不起作用,我得到 - UnexpectedRollbackException:事務回滾,因為它已被標記為僅回滾。
將不勝感激任何建議,謝謝!
uj5u.com熱心網友回復:
如果在 DB 訪問期間出現例外,Hibernate通常會將完整事務標記為rollbackOnly,即使有人會通過@Transactional(noRollbackFor=Exception.class)注釋屬性顯式嘗試避免這種行為。
所以在這些情況下,需要有一個不同的解決方案,例如為兩個方法呼叫設定單獨的事務。
(類似問題:處理大資料插入的sql例外)
uj5u.com熱心網友回復:
我假設您@Transactional在內部某處有一個由 Spring( )管理的事務methodB。在 Spring 中,當RuntimeException在該事務中拋出a 時,該事務被標記為回滾。
來自 Spring 檔案:
在其默認配置中,Spring Framework 的事務基礎結構代碼僅在運行時、未經檢查的例外情況下將事務標記為回滾;也就是說,當拋出的例外是 RuntimeException 的實體或子類時。
請參閱:https : //docs.spring.io/spring-framework/docs/4.2.x/spring-framework-reference/html/transaction.html#transaction-declarative-rolling-back
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/409706.html
標籤:
下一篇:如何解決415不支持的媒體型別
