写在最前面:
1. 事务介绍
1.1 本地事务
1.2 分布式事务
分布式事务典型场景:
1.跨库事务:一个应用某个功能需要操作多个库,不同的库中存储不同的业务数据;
2.分库分表:一个库数据量比较大或者预期未来的数据量比较大,都会进行水平拆分;
3.服务化:一个订单支付功能调用多个服务,每个服务有不同的数据库操作,同时成功或失败。
2. 常见的分布式解决方案
2.1 两阶段提交协议2PC
解决分布式事务,也有相应的规范和协议。分布式事务相关的协议有2PC、3PC。目前绝大多数分布式解决方案都是以两阶段提交协议2PC为基础的。
2PC(两阶段提交,Two-Phase Commit)
2.2 AT、TCC、Saga、XA 的4种分布式事务实现
2.2.1 AT模式
AT模式如何做到对业务的无侵入:
2.2.2 TCC模式
蚂蚁金服TCC实践设计:
3. Seata是什么?
Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata将为用户提供了AT、TCC、SAGA和XA 事务模式,为用户打造一站式的分布式解决方案。
3.1 Seata的三大角色
4. Seata AT模式原理
4.1 设计亮点
4.2 存在的问题
5. Seata快速开始
5.1 db数据源配置
- 下载seata项目包,github.com/seata/seata…
- 打开config/file.conf文件,修改mode="db",修改数据库连接信息;
- 新建数据库seata_server,执行sql脚本创建global_table、branch_table和lock_table表:github.com/seata/seata…
5.2 nacos配置
- 将Seata Server注册到Nacos,修改conf目录下的registry.conf配置;
- 获取/seata/script/config-center/config.txt,修改配置信息,配置信息同步到nacos;
- 启动Seata,支持的启动参数:
sh seata-server.sh -p 8091 -n 1 ; sh seata-server.sh -p 8092 -n 2 ; sh seata-server.sh -p 8093 -n 3 ;
5.3 接入微服务应用
- 启动Seata server端,使用nacos作为配置中心和注册中心;(上面已完成)
- 添加pom依赖:
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-seata</artifactId> </dependency> - 各微服务order、stock对应数据库中添加undo_log表:github.com/seata/seata…
CREATE TABLE IF NOT EXISTS `undo_log` ( `branch_id` BIGINT NOT NULL COMMENT 'branch transaction id', `xid` VARCHAR(128) NOT NULL COMMENT 'global transaction id', `context` VARCHAR(128) NOT NULL COMMENT 'undo_log context,such as serialization', `rollback_info` LONGBLOB NOT NULL COMMENT 'rollback info', `log_status` INT(11) NOT NULL COMMENT '0:normal status,1:defense status', `log_created` DATETIME(6) NOT NULL COMMENT 'create datetime', `log_modified` DATETIME(6) NOT NULL COMMENT 'modify datetime', UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`) ) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COMMENT ='AT transaction mode undo table'; - 修改application配置:
# seata config配置:可以读取seataClient的一些配置 seata.config.type=nacos seata.config.nacos.server-addr=192.168.1.7:8849 seata.config.nacos.group=SEATA_GROUP seata.config.nacos.username=nacos seata.config.nacos.password=nacos - 微服务发起者(TM 方)需要添加@GlobalTransactional注解
- 测试:下单成功,正常写入订单纪录和扣库存;下单异常,无写入订单纪录和扣库存纪录。
6.Seata运行原理总结
生命周期:
-
一进入事务方法中就生成全局事务XID:
-
运行数据库操作方法,纪录事务参与者,生成undo_log日志,生成行锁:
-
全局事务提交。
充分说明了分布式解决方案,能不用就不用!!!