一行代码解决分布式事务问题

一、前言

分布式事务想必大家都比较熟悉了,也知道分布式事务的一些解决方案,什么两阶段,三阶段,基于消息的最终一致性等方法,相信大家都是耳熟能详了。这个问题也是面试中被问的最多的。略作准备的话,基本是难不住大家的。而且这些原理其实就是一个造轮子的过程。所以本文不再对分布式事务问题的原理进行展开,只教大家如何使用几个现成的轮子,以便能优雅地实现你的业务需求。

在Spring中,可以通过注解@Transactional来控制本地事务,这里介绍两个框架来通过一个注解实现分布式事务的控制。

二、LCN 分布式事务框架

1.LCN就是下面三个单词的首字母组合。

  • 锁定事务单元( 

    lock 

  • 确认事务模块状态( 

    confirm 

    )
  • 通知事务( 

    notify 

    )

2.LCN 框架核心执行步骤

  • 创建事务组: 是指在事务发起方开始执行业务代码之前先调用 TxManager 创建事务组对象,然后拿到事务标示GroupId的过程。

  • 添加事务组: 添加事务组是指参与方在执行完业务方法以后,将该模块的事务信息添加通知给 TxManager 的操作。

  • 关闭事务组: 是指在发起方执行完业务代码以后,将发起方执行结果状态通知给 TxManager 的动作。当执行完关闭事务组的方法以后, TxManager 将根据事务组信息来通知相应的参与模块提交或回滚事务。

3.LCN的部署

LCN 是通过一个独立的微服务

tx-manager

作为分布式事务控制服务端(事务协调器)。需要执行分布式事务控制的微服务应用都通过远程服务调用的方式,在 tx-manager 上标记事务组,在执行事务处理后,将本地事务状态发送到 tx-manager 中对应的事务组上,tx-manager 会根据具体的状态来通知相应的微服务应用提交或回滚。

tx-manager 也是使用 Spring Cloud 开发的一个微服务应用,在搭建过程上是非常简单的。具体步骤请自行百度。

4.在微服务中使用LCN实现分布式事务管理

引入maven依赖:

<dependency>

    <groupId>com.codingapigroupId>    <artifactId>transaction-springcloudartifactId>dependency><dependency>    <groupId>com.codingapigroupId>    <artifactId>tx-plugins-dbartifactId>dependency>

在全局配置文件中增加下述配置:

# 定义事务协调器所在位置。根据具体环境定义其中的IP地址和端口。

tm.manager.url=http://127.0.0.1:8899/tx/manager/

微服务提供一个用于获取 txUrl( txUrl就是全局配置文件中定义的 tm.manager.url )的类型实现

@Service

public class TxManagerTxUrlServiceImpl implements TxManagerTxUrlService {    @Value("${tm.manager.url}")    private String url;    @Override    public String getTxUrl() {        return url;    }}

在分布式事务管理代码中增加注解 `@TxTransaction` 。

在业务调用方增加的注解需要属性

isStart=true

。而被调用方则不需要定义任何的注解属性。

@TxTransaction(isStart=true)

@Transactionalpublic void trade() {    //本地调用    tradeDao.save();    //远程调用方    orderService.order();}

三、分布式事务框架FESCAR

1.FESCAR的前世今生

FESCAR(Fast & Easy Commit And Rollback) 是一个用于微服务架构的分布式事务解决方案,它的特点是高性能且易于使用,旨在实现简单并快速的事务提交与回滚。

2019 年 1 月,阿里巴巴中间件团队发起了开源项目 Fescar (Fast & EaSy Commit And Rollback) ,和社区一起共建开源分布式事务解决方案。Fescar 的愿景是让分布式事务的使用像本地事务的使用一样,简单和高效,并逐步解决开发者们遇到的分布式事务方面的所有难题。

Fescar 开源后,蚂蚁金服加入 Fescar 社区参与共建,并在 Fescar 0.4.0 版本中贡献了 TCC 模式。

为了打造更中立、更开放、生态更加丰富的分布式事务开源社区,经过社区核心成员的投票,大家决定对 Fescar 进行品牌升级,并更名为 Seata ,意为: Simple Extensible Autonomous Transaction Architecture ,是一套一站式分布式事务解决方案。

2.FESCAR的实现原理

FESCAR的创新之处在于,每个局部事务执行完立即提交,释放本地锁;它会去解析你代码中的sql,从数据库中获得事务提交前的事务资源即数据,存放到undo_log中,全局事务协调器在回滚的时候直接使用undo_log中的数据覆盖你提交的数据。

FESCAR其实就是说,把分布式事务当作一批branch本地事务来执行,branch各自执行,各自提交,假如所有branch都成功,那么commit的时候,维护一个状态即可,因为大家已经提交了;假如某一个branch执行失败,那么进行回滚,回滚的方式是根据之前的undolog生成一个反向的回滚sql,各个branch分别执行自己的回滚sql来达到回滚的效果。

这与XA的两阶段提交相比,优势在哪呢?1.不需要数据库支持XA协议,因为这个proxy是在应用层面。限制更少。2.减少了事务持锁时间,从而提高了事务的并发度。

3.QuickStart

开启FESCAR服务

  • 下载FESCAR安装包并解压

  • 运行启动脚本sh fester-server.sh /User/min.ji/Downloads/data

一些必要的配置

请参考github和百度

一个注解`@GlobalTransactional`在业务方法中

@GlobalTransactional

public void purchase(String userId, String commodityCode, int orderCount) {    ......}

除了上面的方案,还有一些其他方案,就不一一列举了。大家重点理解实现原理和使用方式即可。

参考资料:

  1. tx-lcn 官方地址:https://www.txlcn.org/

  2. tx-lcn Github地址:https://github.com/codingapi/tx-lcn

  3. tx-lcn 服务下载地址:https://pan.baidu.com/s/1cLKAeE#list/path=%2F

  4. tx-lcn 服务源码地址:https://github.com/codingapi/tx-lcn/tree/master/tx-manager

  5. fescar Github地址:https://github.com/alibaba/fescar

猜你喜欢

转载自blog.csdn.net/lgxzzz/article/details/121311418