seata整合
spring cloud版本 G版本
1. maven文件
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>1.4.1</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
<version>2.2.0.RELEASE</version>
<exclusions>
<exclusion>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
</exclusion>
</exclusions>
</dependency>
2. 数据源要进行代理
import io.seata.rm.datasource.DataSourceProxy;
@Primary
@Bean("dataSource")
public DataSourceProxy dataSource(DataSource druidDataSource){
return new DataSourceProxy(druidDataSource);
}
@Override
public PlatformTransactionManager annotationDrivenTransactionManager() {
logger.info("开始装载 annotationDrivenTransactionManager.dataSource>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
return new DataSourceTransactionManager(druidDataSource());
}
@Bean(name = "sqlSessionFactory")
public SqlSessionFactory sqlSessionFactoryBean(DataSourceProxy dataSourceProxy) throws Exception {
MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean();
sqlSessionFactory.setDataSource(dataSourceProxy);
3.业务代码:
只需要再开始的方法上加一个分布式注解:
@GlobalTransactional(name = "fsp-create-order",rollbackFor = Exception.class)
这样整个一套链路的Feign调用,包括两个服务之间的来回调用,都不用加事务注解,seata会自动传递xid,并且进行分布式事务
4.注意事项,请看官方文档
https://seata.io/zh-cn/docs/overview/faq.html
seata高可用测试:
seata启动三台,注册到eureka
1.seata挂掉一台
①如果开始事务没有再这一台seata上,那么不会影响事务进行,会很快切换到其他机器的seata上
②如果开始事务在这台seata上,第二阶段的事务会发生回滚失败,一直重试到配置文件中设置的回滚超时时间,建议不用特殊处理,因为大多数情况,此时分布式事务是成功的
如果要处理可自定义实现FailureHandler做邮件通知或其他
2.seata全部挂掉,
①应用正常运行,此时会有错误日志,连接到不到seata,不影响不进行分布式事务的增删改查
有@GlobalLock和@GlobalTransactional注解的分布式事务方法,全部不能够进行
②应用重启,会有错误日志,能够正常重启成功,请求正常进行
有@GlobalLock和@GlobalTransactional注解的分布式事务方法,全部不能够进行
总结:
seata高可用还是非常好的,能够再一台挂掉后,快速切换到另一台,全部挂掉,要及时进行处理,否则会影响正常业务进行