Kaze
Kaze
Published on 2023-10-20 / 17 Visits
0
0

Seata

Seata分TC、TM和RM三个角色,TC(Server端)为单独服务端部署,TM和RM(Client端)由业务系统集成。

Seata服务端部署

脚本

client端sql脚本

undo_log表

配置中心参数导入脚本

通用参数文件config.txt

nacos配置中心参数导入脚本

server端数据库脚本

lock_table、branch_table 与 global_table

启动Server

Server端存储模式(store.mode)现有file、db、redis三种,file模式无需改动,直接启动即可。

file模式为单机模式,全局事务会话信息在内存中读写并持久化本地文件root.data,性能较高;

db模式为高可用模式,全局事务会话信息通过db共享,相应性能差些;

redis模式Seata-Server 1.3及以上版本支持,性能较高,存在事务信息丢失风险,请提前配置合适当前场景的redis持久化配置.

1.下载并解压启动包

点击下载

2.建表(仅db)

创建名为seata的数据库并运行server端数据库脚本

seata数据库切勿启用读写分离

3.修改配置

seata-->conf-->application.yml,修改store.mode=db

seata-->conf-->application.example.yml中附带额外配置,将其中db相关配置复制至application.yml中并修改store.db相关属性。

4.启动

sh seata-server.sh -h [本机ip] -p 8091 -m db

-h: 注册到注册中心的ip

-p: Server rpc 监听端口

-m: 全局事务会话信息存储模式,file、db、redis,优先读取启动参数

-n: Server node,多个Server时,需区分各自节点,用于生成不同区间的transactionId,以免冲突

-e: 多环境配置

业务系统集成Client

1.添加seata依赖

依赖spring-cloud-alibaba-seata,内部集成了seata,并实现了xid传递

<dependency>
	<groupId>io.seata</groupId>
	<artifactId>seata-spring-boot-starter</artifactId>
	<version>最新版</version>
</dependency>
<dependency>
   	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
    <version>最新版本</version>
    <exclusions>
     	<exclusion>
            <groupId>io.seata</groupId>
            <artifactId>seata-spring-boot-starter</artifactId>
         </exclusion>
     </exclusions>
</dependency>

2.undo_log建表

运行client端sql脚本

每个分片数据库都要建表

3.数据源代理

分为自动和手动配置数据源代理

自动:

seata.enable-auto-data-source-proxy=true

手动:

seata.enable-auto-data-source-proxy=false

创建数据源配置类

@Configuration
public class DataSourceConfig {

@Autowired
   private Environment env;
 
   @Bean
   public DataSource getDataSource() {
      DruidDataSource dataSource = new DruidDataSource();
      dataSource.setUrl(env.getProperty("spring.datasource.url"));
      dataSource.setUsername(env.getProperty("spring.datasource.username"));
      dataSource.setPassword(env.getProperty("spring.datasource.password"));
 	dataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
      //这上面是获取配置文件中的信息,url,username,password,driverclassname等
      return dataSource;
   }


    @Primary
    @Bean("dataSource")
    public DataSourceProxy dataSource(DataSource druidDataSource) {
        //AT 代理 二选一
        return new DataSourceProxy(druidDataSource);
        //XA 代理
        return new DataSourceProxyXA(druidDataSource)
    }

}

启动类加注解@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})

与分库分表组件Sharding-JDBC一起使用时推荐手动配置数据源代理,并删除getDataSource()

4.属性配置

seata:
  enabled: true
  application-id: geekgame-account-app
  tx-service-group: default_tx_group
  enable-auto-data-source-proxy: true
  config:
    type: nacos
    nacos:
      namespace:
      serverAddr: 182.92.185.137:8848
      group: SEATA_GROUP
      username: "nacos"
      password: "nacos"
      data-id: seata.properties
  registry:
    type: nacos
    nacos:
      application: seata-server
      server-addr: 182.92.185.137:8848
      group: SEATA_GROUP
      namespace:
      username: "nacos"
      password: "nacos"

注意事项

1.使用XA模式还需要调整配置文件:

seata.data-source-proxy-mode=XA

2.全局事务注解的使用

A调用B,A方法上加上@GlobalTransactional,B方法上加上@Transactional

3.与ShardingJDBC一起使用时的注意事项

在classpath中增加seata.conf

client {
    application.id = example    ## 应用唯一id
    transaction.service.group = default_tx_group   ## 所属事务组,默认为default_tx_group
}

在事务发起方加上注解

@GlobalTransactional(timeoutMills = 300000) 
@ShardingTransactionType(TransactionType.BASE)

4.预防脏写

延长超时时长,不重试

@DubboReference(timeout = 300000,retries = 0)
private AccountService accountService;

5.事务失效

在同一个类中非事务方法调用事务方法需要注入自己进行调用,如:

public class TransactionServiceImpl implements TransactionService {
	@Autowired
    @Lazy
    private TransactionServiceImpl service;
}

Comment