在没使用@Transaction
之前,我的业务代码模型大概就是下面这样:
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(def);
try {
studentMapper.insertOnestdent(student);
logger.info("Insert one record successfully: " + student.toString());
} catch (Exception ex) {
dataSourceTransactionManager.rollback(transactionStatus);
// ex.printStackTrace();
logger.error("Insert one record unsuccessfully: " + student.toString());
return false;
}
dataSourceTransactionManager.commit(transactionStatus);
return true;
类似上面这样的话不管我上面的数据库操作执行成功还是执行失败,我在日志中都可以得到反馈。
但是上面这样的做法,会造成大量的代码的重复,利用spring提供的aop可以实现这样的日志功能,但是后来看文档发现有一个@Transaction
注解,使用这个注解,代码可以简化成下面这个样子:
@Transactional(rollbackFor = Exception.class)
public boolean insertOneStudent(Student student) {
studentMapper.insertOneStudent(student);
logger.info("Insert one student successfully" + student.toString());
return true;
}
这样当数据库操作执行成功的时候我可以日志中成功的进行记录,但是这样的话当插入操作执行失败的时候我应该如何在日志中进行记录。
我现在的初步想法是自己手动实现一个类似@Transaction
的动态反射的功能,这样每个要影响数据库中的数据修改的方法执行的时候我都在动态反射的invoke()
方法中进行异常的try catch
的处理。但是不知道spring是否内置这样的功能?
p.s: 我尽量想将数据库的操作与处理全部放在service
层面来处理,不想将日志记录的往上面抛。
insertOneStudent方法整个try catch
或者实现@RestControllerAdvice,在里面统一打印异常日志
像这样: