我在服務 A 中有一個方法
@Transactional
public void doSomething() {
for (int i = 0; i < 100; i ) {
anotherService.doThing();
}
}
服務 B 中的另一種方法
@Transactional(propagation = REQUIRES_NEW, noRollbackFor = RuntimeException.class)
public void doThing() {
...
try {
repository.insertRandomValue();
} catch (Exception ignored) {
}
...
}
我的問題是,例如,當“repository.insertRandomValue()”拋出 ConstraintViolationException 時,即使它在 catch() 中被捕獲,執行緒也以
org.springframework.transaction.UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-only
我嘗試將傳播設定為 REQUIRES_NEW 并嘗試將事務管理器和 GlobalRollbackOnParticipationFailure 設定為 false。
@Bean
public JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
JpaTransactionManager manager = new JpaTransactionManager(entityManagerFactory);
manager.setGlobalRollbackOnParticipationFailure(false);
return manager;
}
我希望它簡單地忽略失敗的插入 attampts 并繼續作業。有誰知道如何實作這一目標?
uj5u.com熱心網友回復:
Hibernate 檔案非常清楚,您必須回滾(第 5.16 節例外處理):
如果 JPA EntityManager 或 Hibernate-specific Session 拋出例外,包括任何 JDBC SQLException,您必須立即回滾資料庫事務并關閉當前的 EntityManager 或 Session。
JPA EntityManager 或 Hibernate Session 的某些方法不會使 Persistence Context 保持一致狀態。根據經驗,Hibernate 拋出的任何例外都不能被視為可恢復的。通過在 finally 塊中呼叫 close() 方法確保會話將被關閉。
回滾資料庫事務不會將您的業務物件恢復到它們在事務開始時的狀態。這意味著資料庫狀態和業務物件將不同步。通常,這不是問題,因為例外是不可恢復的,無論如何您都必須在回滾后重新開始。
所以你需要事先檢查是否會有 ConstraintViolationException
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/338267.html
