finally的用法解析(对于try事务的提交与回滚控制)
问题:1.try中事务执行成功,finally如果里面catch异常了,try中会回滚吗?
2.finally中的return会对返回数据造成什么影响?
起因:最近阅读代码时发现调用第三方服务时存在事务问题,于是就测试了finally的用法,在开发中我们可以在处理业务中更好的把控事务控制和异常的捕获。
问题一:因为lz的事务控制是在执行method()时候开启,在执行完方法后才提交;所以对于finally中如果使用了catch,则会使try中事务回滚。亲测代码如下:
1.准备工作:左图是数据库的一条记录,右边是代码执行删除。如果在没有finally时,执行成功且删除。
2.但是当finally存在,且里面有try...catch...操作时,设定finally里面异常时,则第一个try中删除事务将回滚。
总结:所以使用finally执行一些业务时候,必须要慎用,且考虑好事务要怎么去控制。在哪提交。
问题二:finally中的return一定要慎用,会更改返回值。
1.简单的用法:不论try中是否异常给catch,返回的值都是finally决定最终结果
2.当传的是引用:不论异常与否,取得值是最终是try/catch中值加上finally拼接而成。
当我们定义finally里面也有try...catch时效果也是和上面一样
总结:所以在finally中使用return时,一定要注意它会改变值。所以finally一般都是建议处理一些关闭流的操作,而很少会使用return。
如果有问题,欢迎指正!