比如你有个业务的方法里,需要处理一大堆逻辑,还要再调用一下另外一个系统的接口通知数据的变更,最后这个业务方法处理的数据还要入库,这时候,如果你把数据库的修改操作放到代码的中间,最后再调别人的接口,就会出现问题,如果别人的接口特别慢或者网络波动太大,就会导致你的数据没保存,但是事务一直开着。就是个大事务,拖累整个系统。
如下面的伪代码:
但是你要是把调用其他接口的代码放到上面,又会有另一个问题,比如你调人家接口都成功啦,但是你自己的业务逻辑没走通,比如校验失败了,那就是大bug了。
如下面的伪代码:
那么我们应该怎么做才能解决上面的问题呢?
如下面的伪代码:
上面的思路是在你的业务逻辑都走完了,改库操作也没有问题,这个时候单独起个线程去掉其他的接口。你的事务就结束了,也能保证调其他接口的时候数据的正确性。
知识补充:写个小demo验证下taskexecutor是否是开启一个线程,代码如下
如上图所示,taskExecutor的确会开启一个新的线程。
在实际开发的业务中,如果我们既需要自己往自己的数据库插入数据,又需要通知其他系统,这时候为了不耽误主业务的进行就可以通过上面的方法开启一个线程把同步方法切换成异步的代码块。我是阿达,一名喜欢分享知识的程序员,时不时的也会荒腔走板的聊一聊电影、电视剧、音乐、漫画,这里已经有17位小伙伴在等你们啦,感兴趣的就赶紧来点击关注我把,哪里有不明白或有不同观点的地方欢迎留言。