分布式事务Seata
pom依赖
<!-- seata -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
<exclusions>
<exclusion>
<groupId>io.seata</groupId>
<artifactId>seata-all</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-all</artifactId>
<exclusions>
<exclusion>
<artifactId>druid</artifactId>
<groupId>com.alibaba</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- seata END-->
application.yml
seata:
enabled: true
application-id: order_seata
tx-service-group: my_tx_group
enable-auto-data-source-proxy: true
service:
vgroup-mapping:
my_tx_group: default # key与上面的tx-service-group的值对应
registry:
type: eureka
eureka:
application: default
service-url: http://localhost:7001/eureka
weight: 1
配置了enable-auto-data-source-proxy:true
,项目里就不用配置数据源代理了,否则需要配置数据源代理:
/**
* 数据源代理
* @author wangzhongxiang
*/
@Configuration
public class DataSourceConfiguration {
/**
* 普通数据源
*/
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource druidDataSource(){
DruidDataSource druidDataSource = new DruidDataSource();
return druidDataSource;
}
/**
* 代理数据源,DataSourceProxy 绑定undo_log操作
*/
@Primary
@Bean("dataSource")
public DataSourceProxy dataSource(DataSource druidDataSource){
return new DataSourceProxy(druidDataSource);
}
/**
* MyBatis-->手动指定sqlSessionFactory所使用的的数据源
*/
@Bean
public SqlSessionFactory sqlSessionFactory(DataSourceProxy dataSourceProxy)throws Exception{
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSourceProxy);
sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources("classpath*:/mapper/*.xml"));
sqlSessionFactoryBean.setTransactionFactory(new SpringManagedTransactionFactory());
return sqlSessionFactoryBean.getObject();
}
}
配置了service.vgroup-mapping.my_tx_group: default
,@GlobalTransactional注解的name属性就可以省略不填写,否则使用注解时需要指定name值,并且tx-service-group值 与 @GlobalTransactional注解的name属性需要保持一致。还有一种配置事务分组默认值的方式:
spring:
cloud:
alibaba:
seata:
tx-service-group: my_tx_group
以上配置,涉及分布式事务的微服务(例如A调用B,A和B都算是涉及)都要配置。然后只给需要分布式事务的方法上加上@GlobalTransactional(rollbackFor = Exception.class)
即可。