问题
1:在使用@Transactional(rollbackFor = Exception.class)时,将注解加入到了方法上面,
1.1:A方法调用了一个insert方法(插入订单),插入数据库,并且马上调用一个远程RPC接口(将订单编号传过去),RPC接口业务处理后,再回调回来
1.2:A方法回调监听,如果RPC业务回调回来,将回调回来的信息(订单id)进行业务处理,进行select进行数据查询
1.3:SQL查询异常,找不到订单信息
原因:@Transactional(rollbackFor = Exception.class)注解在执行A方法时,A方法业务还未完全执行完成。SQL是不会commit到数据库中,所以在A方法中调用远程回调的时候,如果远程回调业务处理的很快,在A方法还未执行完成的时候,回调给A方法的回调监听,回调监听这时候去数据库查找数据的时候,就会找不到数据。
解决办法:将@Transactional(rollbackFor = Exception.class)注解放到有写入SQL的地方进行注解
网友评论