finally的用法解析(对于try事务的提交与回滚控制)

问题:1.try中事务执行成功,finally如果里面catch异常了,try中会回滚吗?

           2.finally中的return会对返回数据造成什么影响?

起因:最近阅读代码时发现调用第三方服务时存在事务问题,于是就测试了finally的用法,在开发中我们可以在处理业务中更好的把控事务控制和异常的捕获。

问题一:因为lz的事务控制是在执行method()时候开启,在执行完方法后才提交;所以对于finally中如果使用了catch,则会使try中事务回滚。亲测代码如下:

1.准备工作:左图是数据库的一条记录,右边是代码执行删除。如果在没有finally时,执行成功且删除。

finally的用法解析(对于try事务的提交与回滚控制)

2.但是当finally存在,且里面有try...catch...操作时,设定finally里面异常时,则第一个try中删除事务将回滚。

finally的用法解析(对于try事务的提交与回滚控制)

总结:所以使用finally执行一些业务时候,必须要慎用,且考虑好事务要怎么去控制。在哪提交。

 

问题二:finally中的return一定要慎用,会更改返回值。

1.简单的用法:不论try中是否异常给catch,返回的值都是finally决定最终结果

finally的用法解析(对于try事务的提交与回滚控制)

2.当传的是引用:不论异常与否,取得值是最终是try/catch中值加上finally拼接而成。

finally的用法解析(对于try事务的提交与回滚控制)

当我们定义finally里面也有try...catch时效果也是和上面一样

finally的用法解析(对于try事务的提交与回滚控制)

 

总结:所以在finally中使用return时,一定要注意它会改变值。所以finally一般都是建议处理一些关闭流的操作,而很少会使用return。

 

 

如果有问题,欢迎指正!