事务:主要使用@Transactional注解
异常捕获:两种一种直接trycatch,一种是直接全局异常捕获。
分享两个问题?
1.为什么要使用事务注解?
一个接口中会有很多操作,举个简单例子,下单接口,要向好几张表进行插入操作,假设某一个表的插入操作失败了,那么真个接口就应该失败对吧,但是如果你不做事务控制,那么就会存在,有几个表已经插入数据了,并没有回滚,最终数据造成混乱对吧!
此时就需要借助事务的原子性,就是所有操作要么同时成功插入数据库,要么同时失败进行回滚!保证我们数据操作前后的一致性。同时也解释了事务四大特性中的三个特性:原子性,一致性,持久性。
2.如何要使用trycatch呢?
这个情况稍微复杂,我分情况解释
1.文件读写:这种情况主要是为了防止发生异常导致资源无法关闭,最终资源泄露,堆溢出,程序卡死,涉及文件类的一定要特别注意,一般是在finally中进行资源关闭。
2.数据库操作:有可能是因为违反约束导致异常,这种情况我们捕获的目的是只有一个,将这个异常信息转换成我们自己的语言返回给前端,否则你也不想前端突然看到某些一大长串的异常信息,但是在catch中一定要把异常打印出来。
3.为什么要使用全局异常捕获呢?
程序中会有很多我们意想不到的错误出现,我们不可能都注意到对吧,但是如果你即不知道会发生异常,也没有trycatch做可读的错误处理,那么就直接会显示一串异常信息返回给前端,客户一看就懵逼,然后就开始大骂了,所以此时需要全局异常处理,返回错误提示信息直接:操作失败!
同时把异常信息打印出来,便于我们查看日志,然后去分析到底为什么报错。
4.那有全局异常为什么还要用trycatch呢?
1.有些东西全局异常无法处理,例如文件
2.trycatch有更精准的错误提示,我们可控!
5.事务和trycatch的冲突点
就一个事,跟事务的失效场景有关系,事务只有在发生异常时才生效?如果你把异常捕获了?但是并没有抛出?这种情况就直接导致事务失效了。
就像这种,假如bbb()方法中发生异常,那么你trycatch捕获了,也就相当于没有发生异常,错误就不会回滚,但是你又想trycatch更精准的提示,怎么办呢?首先一定要重新抛出。
首先我们重新抛出保证了我们事务不会失效,但是这种属于接口报错,就是属于badRequest,也不太友好,我们一般接口都是success,只是响应的code一般是500而已。并且如果不全局处理的话,还是会有一串英文的,还是不太友好,所以还是需要全局异常处理的我这只提供思路,具体代码,网上都有的,
一般是返回code是500的结果的,e.getMessage就是我们的“bbb失败!”,并且要把异常信息打印出来。
6.全局异常捕获会不会导致事务失效
答案是不会。不用担心,我已经测试过了。事务失效的场景也有很多,大家自己去搜一下,注意一下就行,不需要全记住,有个印象就行.
总结:
1.如果有事务:try catch + 全局异常捕获
2.没有事务:直接try catch
一定要打印异常,一般会有一个自己的业务异常类,ServiceException继承RuntimeException