分布式事务解决⽅案-Seata使⽤样例分布式事务解决⽅案 - Seata 使⽤样例
Seata Server端环境准备
(1)从官⽹上下载seata server端的程序包
下载地址:
(2)修改配置
我们是基于file的⽅式启动注册和承载配置的
打开f⽂件
修改service 节点⽬录内容如下:
service {
#vgroup->rgroup
_test_tx_group = "default"
#only support single node
#degrade current not support
enableDegrade = false
#disable
disable = false
#unit ms,s,m,h,d represents milliseconds, seconds, minutes, hours, days, default permanent
}
说明:需要修改uplist = “127.0.0.1:8091”,将该值设置为seata server向外提供服务ip及端⼝(或域名+端⼝)(4)启动server
到bin⽬录下执⾏脚本启动seata server端,注:windows下执⾏seata-server.bat启动;linux下执⾏seata-server.sh启动
2.4 项⽬集成seata
2.4.1 创建⽇志表undo_log
分别在leadnews_article、leadnews_user、leadnews_wemedia三个库中都创建undo_log表
2.4.2 导⼊依赖包
因为有多个⼯程都需要引⼊seata,所以新建⼀个⼯程heima-leadnews-seata专门来处理分布式事务
<dependencies>
<dependency>
<groupId>com.heima</groupId>
<artifactId>heima-leadnews-common</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-all</artifactId>
<version>0.9.0</version>
<exclusions>
<exclusion>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.21</version>
</dependency>
</dependencies>
2.4.3 创建代理数据源
(1)因为多个⼯程都需要依赖与seata,所以在heima-leadnews-seata模块下创建seata的配置类
package com.fig;
import com.alibaba.druid.pool.DruidDataSource;
import batisplus.autoconfigure.MybatisPlusProperties;
import MybatisConfiguration;
import sion.spring.MybatisSqlSessionFactoryBean;
import datasource.DataSourceProxy;
ansaction.SpringManagedTransactionFactory;
import org.t.properties.ConfigurationProperties;
import org.t.properties.EnableConfigurationProperties;
import t.annotation.Bean;
import t.annotation.Configuration;
import t.annotation.Primary;
import io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;
@Configuration
@EnableConfigurationProperties({MybatisPlusProperties.class})
public class DataSourcesProxyConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource druidDataSource() {
return new DruidDataSource();
}
//创建代理数据源
@Primary//@Primary标识必须配置在代码数据源上,否则本地事务失效
@Bean
public DataSourceProxy dataSourceProxy(DataSource druidDataSource) {
return new DataSourceProxy(druidDataSource);
}
private MybatisPlusProperties properties;
public DataSourcesProxyConfig(MybatisPlusProperties properties) {
this.properties = properties;
}
//替换SqlSessionFactory的DataSource
@Bean
public MybatisSqlSessionFactoryBean sqlSessionFactory(DataSourceProxy dataSourceProxy, PaginationInterceptor paginationInterceptor) throws Exception {        // 这⾥必须⽤ MybatisSqlSessionFactoryBean 代替了 SqlSessionFactoryBean,否则 MyBatisPlus 不会⽣效
MybatisSqlSessionFactoryBean mybatisSqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
mybatisSqlSessionFactoryBean.setDataSource(dataSourceProxy);
mybatisSqlSessionFactoryBean.setTransactionFactory(new SpringManagedTransactionFactory());
mybatisSqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources("classpath*:/mapper/*.xml"));
MybatisConfiguration configuration = Configuration();
if(configuration == null){
configuration = new MybatisConfiguration();
}
mybatisSqlSessionFactoryBean.setConfiguration(configuration);
//设置分页
Interceptor[] plugins = {paginationInterceptor};
mybatisSqlSessionFactoryBean.setPlugins(plugins);
return mybatisSqlSessionFactoryBean;
}
}
(2)分别在heima-leadnews-article、heima-leadnews-user、heima-leadnews-wemedia引⼊heima-leadnews-seata⼯程,并且添加⼀下配置类:
@Configuration
@ComponentScan("com.fig")
public class SeataConfig {
}
2.4.4 配置seata-server链接和注册中⼼信息
修改注册中⼼配置,在每个项⽬中必须按照下⽅要求来
将配置⽂件f和配置⽂件f放到每个需要参与分布式事务项⽬的resources中。
service.改成vgroup_mapping.#{spring.application.name}_tx_group = “default”
特别注意:#{spring.application.name}是⼀个变量,指的是该项⽬的名称
spring framework如⾃媒体微服务名称的项⽬名称如下:
那么其配置就是vgroup_mapping.leadnews-wemedia_tx_group = "default"
其他项⽬也是这么依次配置
2.4.5 指定事务分组
分别在heima-leadnews-article、heima-leadnews-user、heima-leadnews-wemedia微服务的l⽂件中添加如下配置:spring:
cloud:
alibaba:
seata:
tx-service-group: ${spring.application.name}_tx_group
2.4.6 在分布式事务控制⽅法上添加注解@GlobalTransactional
在ApUserRealnameServiceImpl类的updateStatusById⽅法上加上@GlobalTransactional注解
2.4.7 启动seata-server
运⾏:/seata/bin/seata-server.bat
2.4.8 测试
(1)功能测试,看功能能否正常执⾏。
(2)异常测试,我们在⽅法中添加int x=1/0 ,看认证信息和⾃媒体⽤户是否能够回滚。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。