分布式事务

最近学习完了SpringCloudAlibaba组件的使用,现在来学习分布式事务的理论,因为谈到分布式那么分布式事务是绕不开的话题。

1.分布式事务是什么?

分布式事务解决方案有很多种,seate提供了AT、TCC、SAGA、XA等事务模式,这里我引用seate官网(Seata 是什么)XA二阶段提交模式的一张图来解释一下,在微服务之间通过RPC调用,上游服务能感知到下游服务的异常(如openfeign的fallbackfactory),但是如果上游服务的事务出现异常,该如何让下游服务事务回滚呢?这里我把事务这个抽象的概念提升到整个微服务调用链,称之为分布式事务,既将分散在各个模块的本地事务,整合成一个总的分布式事务,把每个模块的本地事务抽象层分布式事务的每一个操作,如A服务->B服务->C服务,这个调用链之内的事务统称为分布式事务,一旦中途任何一部分出现异常,这个调用链内的所有事务都需要回滚(这个机制和本地事务的回滚机制很像,不同点在于是面向的对象不同),保证数据的一致性。

2.分布式事务解决了什么问题?

多说理论无用 还得上代码测试( show me the code ) 

这段代码是 服务提供者的事务,下游服务(B服务)

@Transactional
public CommonResult providerSave() {
    Provider provider = new Provider();
    provider.setName("provider测试");
    save(provider);
    return CommonResult.ok();
}

这段是服务调用者的事务,上游服务(A服务)

@Transactional
public CommonResult consumerSave() {
    //这里使用openfeign远程调用B服务
    providerFeign.testbb();
    Consumer consumer = new Consumer();
    consumer.setName("测试插入数据");
    //A服务本地插入一条数据
    save(consumer);
    //这里会出现一个运行时异常 0不能作为除数
    int a = 10 / 0;
    return CommonResult.ok();
}

这种情况下 A服务调用B服务 A服务出异常被回滚,那B服务的数据为了数据一致性是不是应该也要回滚呢?B服务的数据怎么回滚呢?

 根据数据库反应的情况我们可以看到 A服务的consumer数据并没有插入(回滚成功) B服务的数据却插入成功了(没有触发回滚),那么该如何解决这种问题呢?也就是说如何在A服务出现异常的时候B服务也要回滚呢?

3.seate分布式解决方案

欲知后事如何,且听下回分解。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值