分布式事务 seata企业级解决方案

分布式事务,seata企业级解决方案

(着急的可直接看第三部分)

一.事务相关介绍:

1.1简单理解:事务可以理解为要么把事情都做完,要么都不做,不能只做一半。

1.2事务四原则:

1.3分布式CAP定理:

对于一个分布式计算系统来说,不可能同时满足以下三点:

  • 一致性(Consistency) (等同于所有节点访问同一份最新的数据副本)
  • 可用性(Availability)(每次请求都能获取到非错的响应——但是不保证获取的数据为最新数据)
  • 分区容错性(Partition tolerance)(以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。)

大部分情况下分布式事务更多保证可用性,互联网应用一般对用户体验,响应速度,并发性都有高要求,通常不会采用强一致性,而是选择保证最终一致性

二.分布式事务的一些原理介绍

分布式事务是什么?如何保证 "最终一致性”?

2.1 Java分布式事务解决方案JTA

(XA是规范,通过JTA来实现这个规范)

J2EE容器:Weblogic JBoss可作为JTA承载者 。没有tomcat,因为tomcat需要另外增加插件。

容器作为协调者,此方案下实现事务需要两个阶段准备阶段、提交阶段(准备阶段 提交阶段 回滚阶段)。各模块服务向协调容器发送准备完成信号,所有服务准备发好,容器向个服务发送提交命令。过程出中问题就回滚。

JTA存在的问题:

1.并发,响应时间性能差

2.协调容器单点性能有限,可能形成瓶颈

3.个别服务过程出问题,导致脑裂

4.不能保证最终一致性

JTA的优点:

JTA的J2EE的标准模块,额外消耗小。JTA适合传统管理类系统的改造

2.2TCC分布式方案:

1.try阶段

表改造,增加预增字段。变化值先放在预增字段

2.Confirm确认阶段

3.Cancel取消阶段

4.如何保证最终一致性

三.分布式事解决方案Alibaba Seata

下面进入正题,这是一主流的分布式事务解决方案

http://seata.io/zh-cn/index.html seata官网可了解更多详情

3.1.seata是什么?

3.2.为什么选择seata

3.3. Seata的AT 模式

AT模式两阶段提交协议:

  1. 一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。简单来说就是获得锁,然后生成回滚日志。
  2. 二阶段:
    1. 提交异步化,非常快速地完成。(操作成功的情况下)
    2. 回滚通过一阶段的回滚日志进行反向补偿。(操作失败的情况下)

TM:定义事务的边界,事务开启、提交、回滚。

RM:自动生成回滚日志,上报TC

TC:seata事务控制程序

简单看一下回滚日志示例,能更好的帮助理解,日志中记录的是数据库修改前和修改后的数据,回滚时自动按照日志执行回退操作。

3.3.1.seata如何使用?

要使用seata需要完三部分的安装、配置,分别是安装TC,配置RM,配置TM

第一步TC配置:

1.在官网下载、安装seata1.0.0

2.在conf文件夹对file.conf registry.conf进行配置

registry.conf关键参数

registry.conf部分表示注册相关,config表示系统配置相关。示例中注册选择为eureka,系统配置使用默认根据file.conf配置

type表示使用eureka微服务模式,配置对应的地址和application

file.conf两个关键参数

 vgroup_mapping.my_test_tx_group = "default"

 default.grouplist = "127.0.0.1:8091" (第二个参数的前缀default,根据第一个参数的value来定)

第二步RM配置:

1.搭建好微服务环境

2.每个业务数据库都需要undo log表,到seata官网的快速启动 菜单中查找建表语句

3.依赖

<!--seata-->

<dependency>

    <!--这个依赖是springcloud和seata的整合包,2.1.1整合包使用的是0.7的seata-->

    <groupId>com.alibaba.cloud</groupId>

    <artifactId>spring-cloud-alibaba-seata</artifactId>

    <version>2.1.0.RELEASE</version>

    <exclusions>

        <exclusion>

            <groupId>io.seata</groupId>

            <artifactId>seata-all</artifactId>

        </exclusion>

    </exclusions>

</dependency>

<dependency>

    <!--这个依赖是真正的seata,手动换成1.0.0版本-->

    <groupId>io.seata</groupId>

    <artifactId>seata-all</artifactId>

    <version>1.0.0</version>

</dependency>

4..注册文件配置(和第一步一样,就是把文件复制一份放到项目的resource文件夹下)

5.配置文件配置(和第一步一样,就是把文件复制一份放到项目的resource文件夹下)

6.yml配置

7.数据源代理,自动生成回滚日志

7.1使用druid作为数据源

7.1创建DataSourceProxy,扩展数据源功能,增加执行回滚日志功能

7.3调整数据库连接配置sqlSessionFactory使用代理数据源创建数据库连接

7.4排除springboot自带的数据库连接池,在启动类上修改@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)

第三步TM配置:

在业务操作类中配置全局事务

3.3.2AT模式解析:

注意点:全局锁,锁住整个数据库

写操作时获取全局锁。为什么不用表锁,锁住对应的操作表呢?因为也要将undo表锁住,不然出现多个同一操作的回滚日志无法准确回滚。

读操作的时候其他程序可以修改该数据,如果需要读取强一致性,在查询的sql语句加 select for update

3.4.seata的TCC模式:

该模式不需要数据库支持事务功能,但是在确认阶段和取消阶段的功能实现需要手动通过编码实现。

推荐使用AT模式,待更新....

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值