分享事务和异常捕获如何正确使用!

事务:主要使用@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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值