分布式事务问题
分布式前
单机单库没这个问题
从1:1 -> 1:N -> N:N
分布式之后
一句话
一次业务操作需要跨多个数据源或需要跨多个系统进行远程调用,就会产生分布式事务问题
Seata简介
Senta是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务
官网地址
http://seata.io/zh-cn/
一个典型的分布式事务过程
分布式事务处理过程的ID+三组件模型
Transaction ID全局唯一的事务ID
三组件概念
TC - 事务协调者
维护全局和分支事务的状态,驱动全局事务提交或回滚。
TM - 事务管理器
定义全局事务的范围:开始全局事务、提交或回滚全局事务。
RM - 资源管理器(数据库)
管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
处理过程
去哪下
发布说明: https://github.com/seata/seata/releases
怎么玩
本地@Transational
全局@GlobalTransactional
seata的分布式交易解决方案
Seata-Server安装
1、官网地址
https://seata.io/zh-cn/blog/download.html
2、下载版本
3、seata-server-0.9.0.zip解压到指定目录并修改conf目录下的file.conf配置文件
先备份原始file.conf文件
主要修改:自定义事务组名称+事务日志存储模式为db+数据库连接信息
file.conf
service模块
store模块
4、mysql5.7数据库新建库seata
5、在seata库里建表
建表db_store.sql在\seata-server-0.9.0\seata\conf目录下
db_store.sql
sql
6、修改seata-server-0.9.0\seata\conf目录下的registry.conf配置文件
7、先启动Nacos端口号8848
8、再启动seata-server
\seta\bin\
seata-server.bat
订单/库存/账户业务数据库准备
以下演示都需要先启动Nacos后启动seata,保证两个OK
分布式事务业务说明
创建业务数据库
seata_order:存储订单的数据库
seata_storage:存储库存的数据库
seata_account:存储账户信息的数据库
建库SQL
按照上诉3库分别建对业务表
seata_order库下建t_order表
seata_storage库下建t_storage表
seata_account库下建t_account表
按照上诉3库分别建立对应的回滚日志表
订单-库存-账户3个库下都需要建各自的回滚日志表
\seata-server-0.9.0\seata\conf目录下的db_undo_log.sql
建表sql
最终效果
订单/库存/账户业务微服务准备
业务需求
下订单 -> 减库存->扣余额 ->改(订单)状态
新建订单Order-Module
1、seata-order-service2001
2、POM
我自己配置新增 0.9.0的seata包时报错了
com.google.errorprone
如果你遇到和我一样的错误,建议引入这个包error_prone_core
3、YML
4、file.conf
就是seata文件夹下的file.conf
5、registry.conf
6、domain
CommonResult
Order
7、Dao接口及实现
orderDao
resources文件夹下新建mapper文件夹后添加
8、Service接口及实现
OrderService
StorageService
AccountService
OrderServiceImpl
9、Controller
10、Config配置
MyBatisConfig
DataSourceProxyConfig
11、主启动
新建库存Storage-Module
新建账户Account-Module
Test
数据库初始情况
下订单->减库存->扣余额->改订单状态
正常下单
http://localhost:2001/order/create?userId=1&productId=1&count=10&money=100
数据库情况
超时异常,没加@GlobalTransational
AccountServiceImpl添加超时
数据库情况
故障情况
当库存和账户金额扣减后,订单状态并没有设置为依据完成,没有从零改为1
而且由于feign的重试机制,账户余额还有可能被多次扣减
超时异常,添加@GlobalTransational
结果
各数据库无记录新增
OrderServiceImpl
一部分补充
Seata
2019年1月份蚂蚁金服和阿里巴巴共同开源的分布式事务解决方案
Simple Extensible Autonomous Transaction Architecture ,简单可扩展自治事务框架
2020起始,参加工作后使用1.0以后的版本
再看TC/TM/RM三大组件
分布式事务的执行流程
TM开启分布式事务(TM向TC注册全局事务记录)
按业务场景,编排数据库、服务等事务内资源(RM向TC汇报资源准备状态)
TM结束分布式事务,事务一阶段结束(TM通知TC提交/回滚分布式事务)
TC汇总事务信息,决定分布式事务是提交还是回滚
TC通知所有RM提交/回滚 资源,事务二阶段结束
AT模式如何做到对业务的无侵入
是什么
一阶段加载
二阶段提交
二阶段回滚
debug
补充