这两天发现一个问题,记录一下。
由于业务问题,不想在service层做事务控制。
在controller层调用多个service,由同一个事务控制。
– 具体案例:
在一个restful接口下调用两个方法, 一个接入service有修改数据库的操作, 第二个方法接入的service钟进行fegin远程调用,将fegin调用进行try,cath并重新抛出自定义异常,试了很多种事务都无效。事务没办法控制,fegin远程调用永远会存在第一次调用time out超时。且事务无法回滚。
后面退而求其次,
采用的方法就是同一个方法在service曾进行事务的控制。奇迹的是,fegin也不会出现那种第一次访问超时的现象。说明一下:fegin调用的两个服务都是我这边本人控制,且调用不存在任何问题,多次正常调用,只是在本次业务场景中产生了这种在controller曾进行多个service事务控制时fegin调用,首次永远超时,再次访问正常的现象。
这种现象的原因似乎是,controller层调用service时,动态代理对象不是同一个对象,由此在controller层进行事务控制时,产生的一种bug,具体没有深入研究,有知道的大佬,可以给我分析一下,谢谢
–后续:这个bug原因后来修改事务后,还是没有解决,最后解决的方案,是在本服务调用的时候设置ribbon的超时时间。
#ribbon (read + connect)*2 < hystrix timeoutInMilliseconds
ribbon.ReadTimeout=70000
ribbon.ConnectTimeout=10000