SpringCloud+Seata分布式事务(AT模式)

什么是 Seata

Seata是一个开源的分布式事务解决方案,致力于提供高性能、易用的分布式事务服务。Seata将为用户提供AT、TCC、SAGA、XA交易模型,为用户打造一站式分布式解决方案。

整体机制:

两个阶段提交协议的演变:
阶段1: 在同一个本地事务中提交业务数据(也就是真正的修改数据库)和回滚日志,然后释放本地锁和连接资源。
阶段2: 对于提交案例,异步快速地完成工作。 对于回滚情况,根据第一阶段创建的回滚日志进行补偿

概念认识:

  1. RM(ResourceManager) ,可以理解为一个一个的微服务,也叫事务参与者;
  2. TM(TranactionManager) 也是一个微服务,但是该微服务是事务的带头大哥,凡是标注@GlobalTransactional的就可以看作是个TM事务管理者,当然它同时也是个RM; 比如,订单服务下单成功后调用库存服务减库存,订单服务的方法上会标注@GlobalTransactional,作为一个TM(库存服务这不需要标注),来管理订单和库存两个服务的整体事务;
  3. TC(全局事务协调者) 也就是seata-server服务,用来保存全局的事务,分支事务,全局锁,然后通知各个RM进行事务提交或回滚;

SpringCloud + Seata(AT模式+文件模式) 的集成

准备:

  • springcloud微服务:
    • seata-order-6500-service订单服务;
    • seata-stock-6502-service库存服务;
  • TC:
    • seata-server服务版本: seata-server-1.1.0.zip

第一步:下载1.1.0版本的TC服务,并解压,windows系统在解压后的文件找到.bat文件即可启动
在这里插入图片描述
紧接者会弹出dos窗口。输出stared就说明TC启动成功了;
在这里插入图片描述

第二步:创建订单库库存服务的数据库

在这里插入图片描述
注意:每个业务库里面都需要有张undo_log
1.收到 TC 的回滚请求后,开始本地事务,执行如下操作。
2.通过 XID 和分支 ID 检索 UNDO LOG。
3.验证数据:将UNDO LOG中更新后的图像数据与当前数据进行比较,如果有差异,说明数据被当前事务外的操作改变了,应该在不同的策略中处理。
4.根据UNDO LOG中的before image和业务SQL的相关信息生成回滚SQL语句

	#undo_log表结构,每个业务数据库下都需要有此表
	
	CREATE TABLE `undo_log` (
	  `id` bigint NOT NULL AUTO_INCREMENT,
	  `branch_id` bigint NOT NULL,
	  `xid` varchar(100) NOT NULL,
	  `context` varchar(128) NOT NULL,
	  `rollback_info` longblob NOT NULL,
	  `log_status` int NOT NULL,
	  `log_created` datetime NOT NULL,
	  `log_modified` datetime NOT NULL,
	  `ext` varchar(100) DEFAULT NULL,
	  PRIMARY KEY (`id`),
	  UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
	) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

第三步:在6500订单服务上引入seata的依赖

	<!--seata分布式事务-->
	<dependency>
		<groupId>com.alibaba.cloud</groupId>
		<artifactId>spring-cloud-alibaba-dependencies</artifactId>
		<version>2.2.0.RELEASE</version>
		<type>pom</type>
		<scope>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值