一 seata的模式
1.1 seata的几种模式比较
Seata基于上述架构提供了四种不同的分布式事务解决方案:
-
XA模式:强一致性分阶段事务模式,牺牲了一定的可用性,无业务侵入
-
TCC模式:最终一致的分阶段事务模式,有业务侵入
-
AT模式:最终一致的分阶段事务模式,无业务侵入,也是Seata的默认模式
-
SAGA模式:长事务模式,有业务侵入
无论哪种方案,都离不开TC,也就是事务的协调者。
1.2 seata的XA模式原理
XA:依赖关系型数据库实现事务实现,基于二阶段提交。
RM一阶段的工作:
① 注册分支事务到TC
② 执行分支业务sql但不提交
③ 报告执行状态到TC
TC二阶段的工作:
-
TC检测各分支事务执行状态
a.如果都成功,通知所有RM提交事务
b.如果有失败,通知所有RM回滚事务
RM二阶段的工作:
-
接收TC指令,提交或回滚事务
截图如下:
1.3 优缺点
XA模式的优点是什么?
-
事务的强一致性,满足ACID原则。
-
常用数据库都支持,实现简单,并且没有代码侵入
XA模式的缺点是什么?
-
因为一阶段需要锁定数据库资源,等待二阶段结束才释放,性能较差
-
依赖关系型数据库实现事务
二 操作案例
2.1 XA模式配置
1.order服务
2.account服务
3.storage服务
2.2 发起全局事务的入口方法添加@GlobalTransactional注解
本例中是OrderServiceImpl中的create方法。
2.3 服务启动
1启动nacos
2.启动seata
2.4 验证
2.4.1 初始态表中数据
1.account表
2.order表
3.storage表
2.4.2 正常下订单操作
1.请求
http://localhost:8082/order?userId=user202103032042012&commodityCode=100202003032041&count=3&money=200
2.查看此时表中数据变化: 均实现了正确的扣减操作
2.4.3 正常下订单大于库存数操作
1.请求: 库存为5个,而现在要下订单30个,请求后出现问题
http://localhost:8082/order?userId=user202103032042012&commodityCode=100202003032041&count=30&money=200
2. 查看程序后台:均提示回滚操作
2.1 account模块
2.2 order模块
2.3 storage模块
3.查看数据表:数据表中的信息也均进行回滚,没有出现脏数据,或者不一致的情况。