(分布式事务)day82分布式查漏补缺

分布式事务

1.网络波动两个节点数据不一致,网络好了之后,最后怎么同步两个节点的数据。

他是自动配置好的。节点之间会互相通信。不需要太关注细节。

2.分布式系统有三个指标:

  • Consistency(一致性)
  • Availability(可用性)
  • Partition tolerance (分区容错性)

在P一定会出现的情况下,A和C之间只能实现一个

3.实际情况下分区一定会发生。

在集群出现分区时,整个系统也要持续对外提供服务

4.BASE理论是对CAP的一种解决思路,包含三个思想:

  • Basically Available (基本可用):分布式系统在出现故障时,允许损失部分可用性,即保证核心可用。
  • **Soft State(软状态):**在一定时间内,允许出现中间状态,比如临时的不一致状态。
  • Eventually Consistent(最终一致性):虽然无法保证强一致性,但是在软状态结束后,最终达到数据一致。

5.seata也是一个微服务。需要注册到nacos中。

要跟seata通信的话,得用事务来建立连接。所以要配置一下seata。

6.我们知道注册到Nacos中的微服务,确定一个具体实例需要四个信息:

  • namespace:命名空间
  • group:分组
  • application:服务名
  • cluster:集群名

7.Seata的架构

Seata事务管理中有三个重要的角色:

  • TC (Transaction Coordinator) - **事务协调者:**维护全局和分支事务的状态,协调全局事务提交或回滚。
  • TM (Transaction Manager) - **事务管理器:**定义全局事务的范围、开始全局事务、提交或回滚全局事务。
  • RM (Resource Manager) - **资源管理器:**管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

8.四种不同的分布式事务解决方案:

  • XA模式:强一致性分阶段事务模式,牺牲了一定的可用性,无业务侵入
  • AT模式:最终一致的分阶段事务模式,无业务侵入,也是Seata的默认模式
  • TCC模式:最终一致的分阶段事务模式,有业务侵入
  • SAGA模式:长事务模式,有业务侵入

无论哪种方案,都离不开TC,也就是事务的协调者。

9.XA是规范,目前主流数据库都实现了这种规范,实现的原理基于两阶段提交。

子事务执行sql,通知TM执行成功,然后TM统一通知各子事务提交操作,或回滚。

RM一阶段的工作:

​ ① 注册分支事务到TC

​ ② 执行分支业务sql但不提交

​ ③ 报告执行状态到TC

TC二阶段的工作:

  • TC检测各分支事务执行状态

    a.如果都成功,通知所有RM提交事务

    b.如果有失败,通知所有RM回滚事务

RM二阶段的工作:

  • 接收TC指令,提交或回滚事务

10.XA的优缺点

XA模式的优点是什么?

  • 事务的强一致性,满足ACID原则。
  • 常用数据库都支持,实现简单,并且没有代码侵入

XA模式的缺点是什么?

  • 因为一阶段需要锁定数据库资源,等待二阶段结束才释放,性能较差
  • 依赖关系型数据库实现事务

注意:XA模式无侵入:事务入口方法下的其他微服务不需要添加任何代码。

单表不需要开启事务。多表需要开启本地事务。

11.实现XA模式步骤:

1)修改application.yml文件(每个参与事务的微服务),开启XA模式:

seata:
  data-source-proxy-mode: XA

2)给发起全局事务的入口方法添加@GlobalTransactional注解。

12.AT模式:

阶段一RM的工作:

  • 注册分支事务
  • 记录undo-log(数据快照)
  • 执行业务sql并提交
  • 报告事务状态

阶段二提交时RM的工作:

  • 删除undo-log即可

阶段二回滚时RM的工作:

  • 根据undo-log恢复数据到更新前

13.AT脏写问题:

在多线程并发访问AT模式的分布式事务时,有可能出现脏写问题

解决思路就是引入了全局锁的概念。在释放DB锁之前,先拿到全局锁。避免同一时刻有另外一个事务来操作当前数据。

14.记录更新前后快照的作用:

更新之前快照是用来回滚的。

更新之后的快照。为了回滚时,对比数据,是否被其他事务操作过。

如果对比不一样,会报错记录到日志里,然后让开发人员来维护数据。

15.全局锁的作用:避免出现脏写,而且其他事务可以查询,提高效率。

有全局锁的话,在锁被占用的时间内,其他事务可以查询,但不可以增删改操作。

如果想操作得等待锁的释放,默认重试30次,每次10毫秒。

注意:必须都得用统一的seate框架。才可以用全局锁。

16.全局锁和DB锁是会出现死锁现象的。

全局锁和DB锁,两个事务分别持有,而且互相等待会出现死锁。

但是会有过期时间限时。所以不会出现长时间的死锁问题。

17.实现AT:

1)AT模式需要一个表来记录全局锁(有内部记录)、另一张表来记录数据快照undo_log(需要自己手动添加到数据库中)。

2)将事务模式修改为AT模式。

seata:
  data-source-proxy-mode: AT # 默认就是AT

3)给发起全局事务的入口方法添加@GlobalTransactional注解:

18.AT模式的优缺点

AT模式的优点:

  • 一阶段完成直接提交事务,释放数据库资源,性能比较好
  • 利用全局锁实现读写隔离
  • 没有代码侵入,框架自动完成回滚和提交

AT模式的缺点:

  • 两阶段之间属于软状态,属于最终一致
  • 框架的快照功能会影响性能,但比XA模式要好很多

19.TCC模式与AT模式非常相似,每阶段都是独立事务,不同的是TCC通过人工编码来实现数据恢复。需要实现三个方法:

  • Try:资源的检测和预留;
  • Confirm:完成资源操作业务;要求 Try 成功 Confirm 一定要能成功。
  • Cancel:预留资源释放,可以理解为try的反向操作。

20.TCC模式优缺点:

TCC模式的每个阶段是做什么的?

  • Try:资源检查和预留
  • Confirm:业务执行和提交
  • Cancel:预留资源的释放

TCC的优点是什么?

  • 一阶段完成直接提交事务,释放数据库资源,性能好
  • 相比AT模型,无需生成快照,无需使用全局锁,性能最强
  • 不依赖数据库事务,而是依赖补偿操作,可以用于非事务型数据库

TCC的缺点是什么?

  • 有代码侵入,需要人为编写try、Confirm和Cancel接口,太麻烦
  • 软状态,事务是最终一致
  • 需要考虑Confirm和Cancel的失败情况,做好幂等处理

21.cancel要是崩了咋办

返回false,TC会再次通知执行cancel的。

22.幂等性就是:网络波动时会发送多次重试的请求。比如我买一件商品

结果网络波动,发了两次重试,那意思就变成了买两次商品了,可不能库存和账号余额扣两次呀。

23.幂等性:新增和修改时需要考虑幂等性,查询和删除不需要考虑幂等性。

24.幂等性、业务悬挂和空回滚:是如何解决的?

设计一张:记录当前事务id和执行状态的表。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EfDdcWRT-1649666154444)(问题2.assets/1649352654817.png)]

25.计算机网络传输协议:

可靠传输协议:TCP

不可靠传输协议:UDP

23.事务技术如何选型

1)XA和钱有关的,保证强一致性。

2)AT负责关系型数据库

3)TCC负责非关系型数据库。

26.TTC的注解:

@TwoPhaseBusinessAction 定义 try confirm cancel 方法名

//把参数保存到上下文对象中。
@BusinessActionContextParameter

//上下文对象可以获取参数的注解,是一个map集合。
BusinessActionContext



@LocalTCC
public interface AccountTCCService {

    /**
     *  一阶段:try 预留
     *  @TwoPhaseBusinessAction 定义 try confirm cancel 方法名
     */
    @TwoPhaseBusinessAction(name = "deduct", commitMethod = "confirm", rollbackMethod = "cancel")
    void deduct(@BusinessActionContextParameter(paramName = "userId") Integer userId,
                @BusinessActionContextParameter(paramName = "money") Integer money);

    /**
     *  二阶段:confirm 提交
     * @param ctx 可以获得 @BusinessActionContextParameter参数和xid
     * @return
     */
    boolean confirm(BusinessActionContext ctx);

    /**
     * 二阶段:cancel 回滚
     * @param ctx 可以获得 @BusinessActionContextParameter参数和xid
     * @return
     */
    boolean cancel(BusinessActionContext ctx);
}

27.Saga模式:是SEATA提供的长事务解决方案。也分为两个阶段:

  • 一阶段:直接提交本地事务(不做冻结、不做快照)
  • 二阶段:成功则什么都不做;失败则通过编写补偿业务来回滚

28.跨公司跨平台用SAGA模式。

事务回滚时间比较长,所以SAGA跨银行转账不是秒到账的

29.Saga模式优点:

  • 事务参与者可以基于事件驱动实现异步调用,吞吐高
  • 一阶段直接提交事务,无锁,性能好
  • 不用编写TCC中的三个阶段,实现简单

缺点:

  • 软状态持续时间不确定,时效性差
  • 没有锁,没有事务隔离,会有脏写

30.AX模式:可以设置读已提交和读未提交。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KigM4ujI-1649666154445)(问题2.assets/1649337711145.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hjtoogDO-1649666154446)(问题2.assets/1649337718316.png)]

31.http重试机制,会不会导致业务悬挂问题。

不会,超时才会出现重试,但是一超时的话,就会导致事务直接空回滚,所以肯定不会出现悬挂的问题。

32xid是从哪里来的呀?

开启全局事务时,会被新建xid

feign调用时,从请求header中获取远程调用xid

33.tCC和AT可以组合使用。

34.四种模式对比

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BYtZnX23-1649666154447)(../../../A_%E9%BB%91%E9%A9%AC%E8%AF%BE%E5%A0%82%E5%BD%95%E5%B1%8F%E8%B5%84%E6%96%99/173%E6%9C%9F%E5%B0%B1%E4%B8%9A%E7%8F%AD%E8%B5%84%E6%96%99/4.173%E5%88%86%E5%B8%83%E5%BC%8F(%E8%A7%86%E9%A2%91%E7%AC%94%E8%AE%B0)]-%E4%BA%8E%E5%B8%85%E8%80%81%E5%B8%88/%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1-seata/%E8%AE%B2%E4%B9%89/assets/image-20220330120948669.png)

35.网络波动导致脑裂,形成两个节点群,两个主节点修改同一行数据,网络好了之后,这同一行的数据会冲突。这个冲突的数据是按照那个节点群去同步,还是会直接报错啊。???

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值