最近再看项目代码,发现很多的service里面,喜欢在事务内部再去调用HTTP请求,简单分析下此种方式的利弊与解决策略。
在数据库内部嵌套TCP连接(一般是HTTP调用或是RPC远程调用)。
@Transactional(rollbackFor = Exception.class)
public Boolean inviteUser(..){
// service 调用
userService.add(..);
// HTTP调用
httpClient.post(..,20)
}
复制
优点:
弊端:
评估审视多个操作调用之间是否有强一致性。
有强一致性
必须手动开启事务,根据HTTP调用的返回码进行手动事务提交或回滚。事务传播级别,尽量使用当前事务。
增加一个查询的动作,用于检索RPC的操作是否正常进行。
无强一致性
手动开启事务,或是使用自动事务注解,但最后可以通过事件监听器回调事务接口的afterCommit
方法,再进行HTTP调用。事务传播级别,尽量使用当前事务。