一.基本环境
1.数据库表的准备
CREATE TABLE `undo_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`branch_id` bigint(20) NOT NULL,
`xid` varchar(100) NOT NULL,
`context` varchar(128) NOT NULL,
`rollback_info` longblob NOT NULL,
`log_status` int(11) NOT NULL,
`log_created` datetime NOT NULL,
`log_modified` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
2.TC服务端部署版本
- 下载地址
- 修改jvm内存(默认是2g,防止内存不够)
./seata-server.sh
启动,默认是8091端口(记得防火墙开放端口,也可以nohup守护进程启动)
TC需要存储全局事务和分支事务的记录,支持三种存储模式
file模式 (默认):性能高, 适合单机模式,在内存中读写,并持久化到本地文件中
在 bin/sessionStore/root.data文件
db模式 :性能较差,适合tc集群模式
redis模式:性能教高,适合tc集群模式
seata 在 JDK11下运行报错
解决: 下载下来的seata 默认没有存放日志文件的目录, 手动创建seata/logs/seata_gc.log 目录和文件
二.springcloudAlibaba整合
1.添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
<exclusions>
<exclusion>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
2.yml配置
seata:
tx-service-group: ${spring.application.name}-group
service:
grouplist:
aaa: 127.0.0.1:8091
vgroup-mapping:
star-user-service-group: aaa
3.代码
- TM入口service的方法增加 @GlobalTransactional 注解
@Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)
@GlobalTransactional
public JsonData register(UserRegisterRequest registerRequest) {
4.全局异常失效解决思路:
* 在入口方法中判断rpc返回的结果并根据结果抛出异常即可
5.总结
- 分布式事务和分布式锁一样,能不用就不用
- 实在要用,使用优先是 柔性事务,实在无法满足再考虑 刚性事务
- 分布式锁也是,尽量降低锁的粒度