@Transactional (noRollbackFor=RuntimeException.class)
public void methodA (Entity e){
service.methodB(e);
}
---service method below---
@Transactional (propagation=Propagation.REQUIRES_NEW, noRollbackFor=RuntimeException.class)
public void methodB (Entity e){
dao.insert(e);
}
When dao.insert(e)
in methodB()
causes a primary key violation and throws a ConstraintViolationException
, which is a subclass of RuntimeException
, I would expect the transaction to still commit because of the noRollbackFor
property I used. But I observed that the outer transaction (on methodA
) is still being rolled back by the HibernateTransactionManager
with the message
org.springframework.transaction.UnexpectedRollback Exception:
Transaction rolled back because it has been marked as rollback-only
I've found similar questions reported but not exactly this one.
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…