【发布时间】:2018-01-17 10:50:09
【问题描述】:
我有以下方法:
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.SERIALIZABLE)
public void applyLog(int codFilial, List<LogLojaCentralCompactoEntity> items) {
}
内部调用:
@Override
@Transactional(noRollbackFor = PersistenceException.class)
public void apply(LogCompactoEntity entity) {
}
第二种方法有一个 try/catch 一个 PersistenceException。问题是事务回滚然后到达 PersistenceException。
我知道 Spring @Transactional 默认在任何未经检查的异常中回滚,但我明确告诉 noRollbackFor PersistenceException。
为什么它不起作用?有什么办法威胁它?
谢谢。
编辑 - apply 内部的 try/catch 方法是这样做的:
try {
insert();
}
catch(PersistenceException e)
{
update();
}
Edit2 - 日志:
Edit3 - 异常处理部分:
if (acao.equalsIgnoreCase("I")) {
try {
insertQuery.executeUpdate();
}
catch(PersistenceException e) {
int affected = updateQuery.executeUpdate();
if(affected == 0)
throw new LogApplyException("O insert falhou e o update não afetou registros.");
}
}
Edit4 - 更多信息:
1) 从 apply 中移除 @Transactional,将 @Transaction 仅留在 applyLog 结果上:
javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: 无法执行语句
2) 与 1 相同,但在此异常上添加 noRollbackFor = PersistenceException.class (on applyLog) 结果:
org.springframework.transaction.TransactionSystemException:无法提交 JPA 事务;嵌套异常是 javax.persistence.RollbackException: 事务标记为 rollbackOnly
编辑 5:
@lzagkaretos 解决方案是有效的(谢谢),但我想知道如何在未来的情况下处理这个问题。
【问题讨论】:
标签: spring spring-boot