【发布时间】:2020-05-01 06:56:04
【问题描述】:
我使用 Spring AOP 为每个保存操作设置了一个日志记录,其中我用@Transactional 进行了标记。问题是当我的保存方法抛出异常并仅用回滚标记事务时,但使用 AOP 的日志记录操作不知道。这就是为什么它导致:
'事务静默回滚,因为它已被标记为仅回滚'。
如何克服这种情况?
我的保存方法:
@Transactional
public void create(SecModuleRequest secModuleRequest) {
SecModule secModule = secModuleRepository.save(pData); // throw data integrity exception
}
我的记录方法:
@Transactional
@AfterReturning(value = "execution(public * save(..)) && this(org.springframework.data.repository.CrudRepository)", returning = "responseEntity")
public void onSaveExecuted(JoinPoint pjp, Object responseEntity) {
try {
...
insertAuditLog(jsonStr, entityActionLog.getQueryClauseExt());
} catch (Exception ex) {
ex.printStackTrace();
}
}
public int insertAuditLog(String auditContent, String queryRowId) {
String sql = " Insert into LOG (LOG_ID,LOG_DATETIME, LOG_CONTENT) " +
" values (LOG_SEQ.NEXTVAL, SYSDATE, ?) ";
Query query = entityManager.createNativeQuery(sql);
query.setParameter(1, auditContent);
int resultInsert = query.executeUpdate();
return resultInsert;
}
【问题讨论】:
-
您是否尝试添加带有
@AfterThrowing注释的方法以从保存方法中捕获异常 -
它无法捕获异常,因为 save 方法在遇到事务方法(创建方法)的最后一条语句之前不会抛出任何异常。这就是为什么它会首先跳转到我的日志记录方法并使 UnexpectedRollbackException 发生。
标签: java spring-boot spring-data-jpa spring-aop