关于Spring事务的一个问题

使用HttpClient 调取一个微服务的接口,返回json格式,数据量较大,我拿到数据后做格式化处理。

调用时报出 一个超时,还有一个 JTA transaction unexpectedly rolled back,后来一步一步debug看,微服务的接口返回时要达到九秒多才返回,而我这边没有等到它返回数据,就直接结束事务往下执行了

由此我想到可能是事务超时,

1·于是我加大了HttpClient的超时时间,---不好使

2·加大我事务的时间----也不行

后来想到我只是一个读的操作,根本不需要事务,而我的项目里面是开启了全局事务,我不能去把全局的事务时间改了而影响到别的操作,就用了@Transactional这个注解

@Transactional

而这个注解里面的参数比较多,具体用到哪一个,我认为我的这个接口只是调取数据然后做显示,并没有去操作数据库,并不需要加入Spring的事务中,而数据库的事务根本不涉及更无可谈

看了这篇帖子   https://www.cnblogs.com/yepei/p/4716112.html  里面有这么一个描述

  • TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。

首先我确定不需要事务,其次我的接口里是有事务的,能够符合我需求的,我看到只有这个,于是加在业务层接口上这一句

@Transactional(propagation= Propagation.NOT_SUPPORTED)

后来看到说可以加上只读,但是只读事务用于客户代码只读但不修改数据的情形,只读事务用于特定情景下的优化,我是有拿到数据做处理,所以此处不适用加只读

@Transactional(propagation= Propagation.NOT_SUPPORTED,readOnly = true)

总结:

        归根结底其实就是事务超时的原因,其实并不是一个大的Bug,只是这里面很多小细节自己没有留意到,记一下长个记性

猜你喜欢

转载自my.oschina.net/u/3526783/blog/1609188