分布式事务——应用间分布式事务

分布式事务分为应用内多数据源事务和应用间分布式事务,应用内多数据源事务参考基于Atomikos的多数据源分布式事务(XA)解决方案 本文主要介绍应用间的分布式事务

分布式事务的几种实现思路

  • 基于消息队列的分布式事务
    即事务发起方首先向消息队列发送消息(注意,此时消息不会被送到消息接收者),然后事务发起方处理本地事务,当本地事务无异常时,向消息中间件发送提交操作,提交刚刚发送的消息;此时消息会被送到消息接收者,消息接收者收到消息后处理本地业务逻辑。
    此方式的优点是响应时间短,资源开销少,缺点是当消息接收者应用内部发生异常并回滚时,无法通知事务发起方回滚事务。
  • TCC
    各个应用针对某个业务场景统一编写事务的处理(try)、提交(confirm)、回滚(cacel)业务逻辑;当事务完成后,各个应用的confirm方法会被调用;当事务出现异常时,各个应用的cacel方法会被调用。
    此方式的优点是业务场景灵活,适应性强;缺点是对开发人员的要求高,需要开发人员自己编写事务回滚逻辑,而且还要保证try和cacel的幂等。
  • TXC
    淘宝推出的基于sql数据库的分布式事务框架,当sql被提交给数据库待执行时,首先txc会首先检查sql预影响的数据,并针对影响结果建立快照和锁(使用redis保存锁),当出现异常时,利用快照和锁回滚数据。
    此方式的优点是对代码的侵入性低,且不占用数据库连接,缺点是由于是针对sql结果进行快照建立的,因此只能在sql数据库上使用。
  • LCN
    LCN并不生产事务,LCN只是本地事务的协调工 ,LCN的原理是在各个应用内的事务管理器插入切面,当事务开启、提交、回滚时,有总的事务调度中心进行所有事务管理器的提交或回滚。
    此方式的优点是对代码的侵入性低,只需要对原代码几乎没有影响;缺点是会占用数据库连接,且数据库必须支持事务(mongodb不支持事务,也就不支持lcn)才可。

分布式事务框架TX-LCN

TX-LCN 框架支持上述4种分布式事务的后3种。更厉害的是,它支持后3种分布式事务方式的混用。这里着重介绍LCN事务的使用,TCC和TXC请参考官方文档。

在项目中集成TX-LCN##

首先,项目必须是springboot项目,且最好使用了2.x以上的springboot,而且这里假定数据源,mybatis/jpa,dubbo/spring-cloud已经都集成好了,此时只需要在项目中引入tx-lcn的依赖即可,这里以dubbo项目为例:

        
            com.codingapi.txlcn
            tx-client-dubbo
        

配置文件(最简配置)

# manager服务地址(rpc端口),可填写多个负载
tx-lcn.client.manager-address=127.0.0.1:8070

这里只需要配置总的事务调度中心的地址即可,且支持填写多个以实现事务调度中心的集群

在项目中使用LCN##

原来的service层代码:

    @Transactional
    public void execute(String name) {
        Demo demo = new Demo();
        ...
        demoMapper.save(demo);
    }

使用LCN的代码

    @TxTransaction
    public void execute(String name) {
        Demo demo = new Demo();
        ...
        demoMapper.save(demo);
    }

唯一的变化就是原注解@Transactional变成了@TxTransaction
当整个事务链中的任何一处发生异常时,都会造成其他所有应用的事务回滚。

你可能感兴趣的:(分布式,springboot)