首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Seata分布式事务学习笔记

目录

一、Seata简介、安装

1、官网地址

2、seata-server-0.9.0.zip解压配置

3、mysql数据库新建库seata

4、在数据库新建表

5、修改seata-server-0.9.0\seata\conf目录下registry.conf配置文件

6、先启动Nacos在启动seata-server

1、一个典型的分布式事务过程

2、使用方法

3、seata-server安装

二、seata原理简介

AT模式

1、说明

2、TC、TM、RM

3、AT模式如何做到对业务无侵入

4、debug

5、补充

三、测试订单、库存、账户业务数据库准备

1、分布式事务也业务说明

2、创建业务数据库

3、最终结果展示

四、订单、库存、账户微服务准备

1、正常下单

2、超时异常,没有加@GlobalTransaction

3、超时异常,加了@GlobalTransaction

1、添加pom配置

2、添加yml配置

3、file.conf

4、registry.conf

5、创建实体类

6、创建dao接口

7、创建serice接口实现

8、创建controller

9、主启动类

1、新建订单Order-Module

2、新建库存Storage-Module、账户Account-Module同上,省略

3、测试

一、Seata简介、安装

Seate是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务

官网:http://seata-io/zh-cn/

下载地址:http://seata.io/zh-cn/blog/download.html

1、一个典型的分布式事务过程

分布式事务处理过程的ID+三组件模型

Transaction Corrdinator()事务协调者:维护全局和分支事务的状态,驱动全局事务提交或回滚

Transaction Manager()事务管理者:定义全局事务的范围,开始全局事务,提交或回滚全局事务

Resource Manager()资源管理者:管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚

全局唯一的事务ID

三组件概念

处理过程

TM向TC申请开启一个全局事务,全局事务创建成功并生成一个全局唯一的XID

XID在微服务调用链路的上下文中传播

RM向TC注册分支事务,将其纳入XID对应全局事务的管辖

TM向TC发起针对XID的全局提交或回滚决议

TC调度XID下管辖的全部分支事务完成提交或回滚请求

2、使用方法

本地@Transactional

seata的分布式交易解决方案

3、seata-server安装

1、官网地址

http://seata.io/zh-=ch下载seata-server-0.9.0.zip

2、seata-server-0.9.0.zip解压配置

先备份原始file.conf文件

主要修改:自定义事务组名称+事务日志存储模式为DB+数据库连接信息

file.conf

1.service模块

2.store模块

3、mysql数据库新建库seata

4、在数据库新建表

建表db_store.sql在\seata-server-0.9.0\seata\conf目录里

5、修改seata-server-0.9.0\seata\conf目录下registry.conf配置文件

6、先启动Nacos在启动seata-server

二、seata原理简介1、说明

0.9不支持集群,1.0以后支持,工作中还是要用1.0以后的版本

2、TC、TM、RM

分布式事务执行流程:

TM开启分布式事务(TM向TC注册全局事务记录)

按业务场景,编排数据库、服务等事务内资源(RM向TC汇报资源准备状态);

TM结束分布式事务,事务一阶段阶段(TM通知TC提交/回滚分布式事务)

TC汇总事务信息,决定分布式事务时提交还是回滚

TC通知所有RM提交/回滚资源,事务二阶段结束

3、AT模式如何做到对业务无侵入

AT模式

前提

基于支持本地ACID事务读关系型数据库

Java应用,通过JDBC访问数据库

整体机制

两阶段提交协议的演变:

一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源

一阶段提交中,seata会拦截“业务SQL”

以上操作全部在一个数据库事务内完成,这样保证了一阶段提交的原子性。

解析SQL语义,找到“业务SQL”要更新的业务数据,在业务数据被更新前,将其保存为“before image”

执行“业务SQL”更新业务数据,在业务数据更新之后

其保存成“after image”,最后生成行锁

二阶段:

提交异步化,非常快速的完成

回滚通过一阶段的回滚日志进行反向补偿

因为“业务SQL”在一阶段已经提交至数据库,所以seata框架只需将

二阶段提交如果时顺利提交的化

二阶段回滚

二阶段如果时回滚的化,seata就需要回滚一阶段已经执行的“业务sql”,还原业务数据

回滚方式便是用“before image”还原业务数据,但是还原前首先要验证脏写,对比“数据库当前业务数据”和“after image”,如果两份数据完全一致说明没有脏写,可以还原数据,如果不一致就说明有脏写,出现脏写就需要转人工处理

4、debug

5、补充

三、测试订单、库存、账户业务数据库准备

1、分布式事务也业务说明

在这里我们会创建三个服务,一个订单服务,一个库存服务一个账户服务>

当用户下单时,会在订单服务中创建一个订单,然后通过远程调用库存服务来扣减单商品的库存,在通过远程掉哦那个账户服务来扣减用户账户里面的月,最后在订单服务中修改订单状态为已完成

该操作跨越三个数据库,有两次远程调用,很明显的分布式事务问题

2、创建业务数据库

seate_order:存储订单的数据库

1.创建t_order表

seata_storage:存储库存的数据库

创建t_storage表

seate_account:存储账户信息的数据库

1.创建t_account表

3、按照上述三库分别建立对应的回滚日志表

订单-库存-账户3个库下都需要建各自的回滚日志表

3、最终结果展示

四、订单、库存、账户微服务准备

下订单—>减库存—>扣余额—>改订单状态

1、新建订单Order-Module

seate-order-service2001

1、添加pom配置

2、添加yml配置

3、file.conf

resources下创建文件file.conf,从seate安装包中赋值配置文件内容

4、registry.conf

resources下创建文件registry.conf,从seata安装包下复制

5、创建实体类

6、创建dao接口

7、创建serice接口实现

8、创建controller

9、主启动类

2、新建库存Storage-Module、账户Account-Module同上,省略

3、测试

1、正常下单

2、超时异常,没有加@GlobalTransaction

AccountServiceImpl添加超时

当库存和账户进饿扣减后,订单状态没有设置为已经完成,没有从0改为1

而且由于feign的重试机制,账户余额可能被多次扣减

3、超时异常,加了@GlobalTransaction

AccountServiceImpl添加超时,下单后数据库数据没有任何改变,分布式事务生效回滚了。

------------END-----------

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20210211A038TX00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券