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

分布式事务分为应用内多数据源事务和应用间分布式事务,应用内多数据源事务参考基于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项目为例:

        <dependency>
            <groupId>com.codingapi.txlcn</groupId>
            <artifactId>tx-client-dubbo</artifactId>
        </dependency>

配置文件(最简配置)

# 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
当整个事务链中的任何一处发生异常时,都会造成其他所有应用的事务回滚。

编辑推荐: 本文来自于csdn,本篇文章主要介绍了LCN5.0.2有3种模式,分别是LCN模式,TCC模式,TXC模式,希望对您的学习 有所帮助。 一、简介 LCN分布式事务框架其本身并不创建事务,而是基于对本地事务的协调从而达到事务一致性的效果。 LCN模式: LCN模式是通过代理Connection的方式实现对本地事务的操作,然后在由TxManager统一协调控制事务。当本地事务提交回滚或者关闭连接时将会执行假操作,该代理的连接将由LCN连接池管理。 该模式的特点: - 该模式对代码的嵌入性为低。 - 该模式仅限于本地存在连接对象且可通过连接对象控制事务的模块。 - 该模式下的事务提交与回滚是由本地事务方控制,对于数据一致性上有较高的保障。 - 该模式缺陷在于代理的连接需要随事务发起方一共释放连接,增加了连接占用的时。 TCC模式: TCC事务机制相对于传统事务机制(X/Open XA Two-Phase-Commit),其特征在于它不依赖资源管理器(RM)对XA的支持,而是通过对(由业务系统提供的)业务逻辑的调度来实现分布式事务。主要由三步操作,Try: 尝试执行业务、 Confirm:确认执行业务、 Cancel: 取消执行业务。 该模式的特点: - 该模式对代码的嵌入性高,要求每个业务需要写三种步骤的操作。 - 该模式对有无本地事务控制都可以支持使用面广。 - 数据一致性控制几乎完全由开发者控制,对业务开发难度要求高。 TXC模式: TXC模式命名来源于淘宝,实现原理是在执行SQL之前,先查询SQL的影响数据,然后保存执行的SQL快走信息和创建锁。当需要回滚的时候就采用这些记录数据回滚数据库,目前锁实现依赖redis分布式锁控制。 该模式的特点: - 该模式同样对代码的嵌入性低。 - 该模式仅限于对支持SQL方式的模块支持。 - 该模式由于每次执行SQL之前需要先查询影响数据,因此相比LCN模式消耗资源与时要多。 - 该模式不会占用数据库的连接资源。 二、原理 核心步骤 1.创建事务组 是指在事务发起方开始执行业务代码之前先调用TxManager创建事务组对象,然后拿到事务标示GroupId的过程。 2.添加事务组 添加事务组是指参与方在执行完业务方法以后,将该模块的事务信息添加通知给TxManager的操作。 3.关闭事务组 是指在发起方执行完业务代码以后,将发起方执行结果状态通知给TxManager的动作。当执行完关闭事务组的方法以后,TxManager将根据事务组信息来通知相应的参与模块提交或回滚事务事务控制原理 LCN事务控制原理是由事务模块TxClient下的代理连接池与TxManager的协调配合完成的事务协调控制。 TxClient的代理连接池实现了javax.sql.DataSource接口,并重写了close方法,事务模块在提交关闭以后TxClient连接池将执行"假关闭"操作,等待TxManager协调完成事务以后在关闭连接。 对于代理连接池的优化 自动超时机制,任何通讯都有最大超时限制,参与模块在等待通知的状态下也有最大超时限制,当超过时限制以后事务模块将先确认事务状态,然后再决定执行提交或者回滚操作,主要为了给最大资源占用时加上限制。 智能识别创建不同的连接 对于只读操作、非事务操作LCN将不开启代理功能,返回本地连接对象,对于补偿事务的启动方将开启回滚连接对象,执行完业务以后马上回滚事务。 LCN连接重用机制 当模块在同一次事务下被重复执行时,连接资源会被重用,提高连接的使用率。 事务补偿机制 为什么需要事务补偿? 事务补偿是指在执行某个业务方法时,本应该执行成功的操作却因为服务器挂机或者网络抖动等问题导致事务没有正常提交,此种场景就需要通过补偿来完成事务,从而达到事务的一致性。 补偿机制的触发条件? 当执行关闭事务组步骤时,若发起方接受到失败的状态后将会把该次事务识别为待补偿事务,然后发起方将该次事务数据异步通知给TxManager。TxManager接受到补偿事务以后先通知补偿回调地址,然后再根据是否开启自动补偿事务状态来补偿或保存该次切面事务数据。 补偿事务机制 LCN的补偿事务原理是模拟上次失败事务的请求,然后传递给TxClient模块然后再次执行该次请求事务。 模拟场景演示 若存在事务发起方、参与方A、参与方B。调用关系图如下 那么他们正常执行业务的时序图为: 若参与方B出现异常,那么他们的业务时序图为: 若他们的调用关系是这样的情况 此时发生参与方B出现异常时他们的时序图为: 三、使用 环境: SpringBoot 2.0.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值