Seata分TC、TM和RM三个角色,TC(Server端)为单独服务端部署,TM和RM(Client端)由业务系统集成。
Seata服务端部署
脚本
client端sql脚本
配置中心参数导入脚本
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;
}