1、环境:
组件名称 | 版本号 |
---|---|
springcloud alibba | 2.2.8.RELEASE |
seata-server | 1.5.2 |
nacos-server | 2.1.1 |
openfeign | 2.2.8.RELEASE |
2、问题描述
通过openFeign服务调用时,当发生异常,数据未回滚
3、问题解决:
需要我们手动注入数据源,数据源代码如下
package cn.cloud.alibaba.nacos.openfeign.seata.storage.config;
import com.zaxxer.hikari.HikariDataSource;
import io.seata.rm.datasource.DataSourceProxy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
/**
* BUG不找我
*
* @author huatao
* @date 2022/10/20 20:13
*/
@Configuration
public class DataSourceConfig {
@Autowired
private DataSourceProperties dataSourceProperties;
@Bean
public DataSource dataSourceProxy() {
HikariDataSource hikariDataSource = new HikariDataSource();
hikariDataSource.setJdbcUrl(dataSourceProperties.getUrl());
hikariDataSource.setUsername(dataSourceProperties.getUsername());
hikariDataSource.setPassword(dataSourceProperties.getPassword());
hikariDataSource.setDriverClassName(dataSourceProperties.getDriverClassName());
return new DataSourceProxy(hikariDataSource);
}
}
4、造成原因:
从官网可以得知,AT模式,其实数据本地事务已经提交,而当我们数据发生异常时,seata会将我们数据修改回之前的数据状态,时反向补偿,而非事务不提交。反向补偿需要seata拦截我们所执行的sql,并生成对应的反向补偿sql,以此来执行事务回滚。我们所使用spring集成数据源时,seata无法拿到所执行的sql语句,所以无法进行反向补偿,所以需要我们手动注入数据源。
欢迎各位大佬有问题指出!!!