通过消息队列实现分布式事务

  • Post author:
  • Post category:其他


事务是什么东西这里不进行细说,写这篇文章的目的也是因为前不久项目上使用到相关知识,在这里做此记录,其实所谓的分布式事务很好理解也非常简单



一、spring&spring boot下的事务实现(普通事务/基于单库的事务)

首先,我们了解一下spring boot下实现事务,这个相对而言很简单,直接可以通过注解去实现:


@EnableTransactionManagement


//开启事务管理,相当于在spring中加配置(<tx:annotation-driven />),在spring boot中默认帮我们配置了,可以不写


@Transactional(rollbackFor=Exception.class)


//注解此service被添加了事务,有捕获到所有的Exception则进行回滚


@Transactional(rollbackFor=IOException.class)


//注解此service被添加了事务,除IOException外对其他异常回滚


详细

:首先使用注解 @EnableTransactionManagement 开启事务支持后,然后在访问数据库的Service方法上添加注解 @Transactional 便可。我们需要关注的是@Transactional的异常作用范围:

@Transactional默认只回滚RunTimeException级别

@Transactional(rollbackFor=Exception.class)回滚到Exception级别(表示Exception级别及一下均会回滚,Excetion子类只有RuntimeException和IOException )

对spring下的事务我们不做过多阐述,大家网上资料甚多;



二、实现分布式事务处理

这里对没使用过分布式的人来说可能有疑问,既然spring和springboot提供了南无好的事务处理机制,我i们为什么要了解分布式事务如何处理呢,分布式事务是什么?下面统一阐述


1、普通事务和分布式事务

对于通常的集成式开发(我们的整个项目所有模块都在同一个项目下,统一进行部署,如果要提高性能,通常进行横向扩展),我们的各个模块所使用的表都在同一个数据库下,这样开发起来很不错,我们在数据处理过程中,直接使用spring的事务管理机制就可以很好的实现事务控制,这就是普通的事务控制。但是集成式开发的弊端就是如果我们的项目很大,即使我们部署很多机器,也会很影响我们的系统性能,那么此时我们的解决方法就是把我们的一些模块拆分成单独的应用进行部署,对于调用量大的模块可以进行多台机器部署,这能很好解决性能问题,但是伴随这个而来的就是我们不能够实现很好的事务控制,这里就要实现分布式事务控制;


2、基于消息队列的分布式事务实现


实现分布式事务还有其他方法,这里我只讲使用的(我认为相对较好的就解决方案)

假设我们要进行转账操作,那么我们会涉及到从转出人账户扣款和从转入人账户增加两部数据操作,假设这两个操作是分布式进行的;

在这里插入图片描述
转账触发:

1、我们进行转出操作(减少转出人余额),这一步操作没有什么问题(如果有问题则会本地回滚,没有到达分布式操作)

2、我们向本地的消息队列(可以为数据库的一张表或单独在本地实现一个消息队列)里面新加一条转账数据(用来标记这个事务正在进行)

3、我们通过MQ向转入账户增加余额服务发送一条MQ

4、增加余额服务收到MQ后进行账户余额增加

5、增加成功后向转出服务发送一条增加成功的MQ

6、转出服务收到MQ后删除消息队列里面的指定事务,表明整个事务执行完毕,交易完成

7、最后,我们有一个定时任务来检测消息队列,如果消息队列里面有积压,则对积压的事务重发MQ,直到事务完成,这里我们也可以进行重发次数限定,如超过多少次后进行数据操作报警;



版权声明:本文为qq_41751237原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。