今天看到同事上传到gitlab上的代码中有集成公司发短信机制,后来就点进去看了一下,当然对于事务这块还是有很多要学的东西,暂时还是一知半解呀(果然我很我聊,还看人家的烂Code(* ̄︶ ̄))。
下面贴出源代码
/*
* 保存任务
* @param task
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public boolean saveTTask(Task task) throws Exception {
try {
// 根据任务标识检查任务是否存在
if (this.checkTaskExistByTaskTag(task.getTaskType(), task.getTaskTag())) {
log.info("[TaskServiceImpl.saveTTask][保存任务:{}]", task.getTaskType() + System.getProperty("line.separator") + task.getTaskTag()
+ System.getProperty("line.separator") + task.getTaskParameter());
return true;
}
taskMapper.insert(task);
return true;
} catch (Exception ex) {
log.error("saveTTask-异常:{}", ex);
// 事务回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
// 任务保存失败发送邮件
this.sentErrorInfoEMail(task, ex.getMessage());
// 把错误抛到外面,这样外面捕到错误后好回滚
throw new Exception();
}
}
其实这个实现相对来说是非常简单的,只是一个简单的增加操作而已。或者可以有一些赘述。这个原理就是前面封装好想要发送的内容、目标等等乱七八糟的东西,然后将数据存储到数据库中,预先写好的定时任务去数据库查到这个任务后将数据读取发送给目标地址。
当然这里面出现了事务的一些东西,一般情况下我们在处理事务时候 @Transactional(rollbackFor = Exception.class) 这个注解完全可以满足我们的需要,当然你可能会问rollbackFor 是什么鬼畜,这个就是生命发生什么异常情况下进行事务回滚,具体还有很多参数,我就不一一细说详细请看人家总结的
Spring Boot 中使用 @Transactional 注解配置事务管理
当然这并不是说加了注解就能够事务回滚的,因为上面的小哥把异常进行try /catch 了,注解回滚是当
throw RuntimeException 的时候才会回滚的。所以小哥又采用了手动回滚的方式
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
当然也可以自定义回滚点,然后手动回滚到回滚点上,详细请看一下:
当然小哥也做了个画蛇添足的事,后面又加了句 throw new Exception();
这个又让注解可以使用了。当然在现实中大家可以吧后面的这个改成 return false
就可以了。今天写了很多“当然”,当然这没有什么毛病。