分布式事务的思考与理解

关于本片随笔

笔者在阅读知乎老刘的文章后有感而写,本文按照自己的观点论述了分布式事务

侵删

-------------------------------------------------------------------

本地事务

ACID特性


A


Atomicity


原子性


C


Consistency


一致性


I


Isolation


隔离性


D


Durability


持久性

一致性是最基本的特性,其他三个特性都是为了保持一致性存在的。

分布式事务

集群

核心:分担请求的压力

多台计算机进行相同的工作

在多个服务器上部署相同的应用,处理同一个问题

分布式

核心:去中心化

多台计算机进行不同的工作

把问题拆分,主要工作是分解任务,职能拆解

【将一套系统拆分成不同的子系统部署在不同服务器上,这叫分布式】

然后部署多个相同的子系统在同一个服务器上,这叫集群】

【部署在不同服务器上的同一个子系统应进行负载均衡

CAP理论

一个分布式系统不可能同时满足一致性、可用性和分区容错性。最多只能满足其中的两项。

而分区容错性是必须要保证的特性,所以就要在一致性和可用性之间进行取舍。


C


Consistency


一致性


A


Availability


可用性


P


Partition tolerance


分区容错性

分布式事务实战

银行转账案例

-----------------------------------------------------------------------------

最初的流程:

1、A银行对转出账户进行检查,扣除金额

2、A银行同步调用B银行的转账接口

3、B银行对转入账户进行检查,增加金额

4、B银行返回处理结果给A银行

处理流程图如下:

但是,这个流程并不能满足银行需求。

可能出现的问题:

1、同步调用远程接口,导致接口耗时太久,主线程阻塞时间长

2、难以控制流量,A银行流量高峰导致B银行系统崩溃

3、扣除金额后A银行宕机,A进行了扣款但B没增加,AB数据不一致。

4、B系统金额增加后宕机,A系统收不到响应后回滚,AB数据不一致。

问题1、2的解决方式:

引入中间件和消息队列

-----------------------------------------------------------------------------

一次修改后的流程:

1、A银行对转出账户进行检查,扣除金额

2、将对B银行的请求写入异步消息队列,主线程返回

3、启动后台程序从队列中获取待处理数据

4、后台程序对B进行远程调用

5、B银行对转入账户进行检查,增加金额

6、B银行返回处理结果给A银行

处理流程图如下:

通过增加消息队列的方式,解决了1、2问题,但是系统的复杂性提升,引入了新问题并且未解决一致性问题。

可能出现的问题:

1、扣款后A系统宕机,写入消息队列失败,AB数据不一致

2、增加余额时失败,向A反馈失败消息时宕机,A不回滚,AB数据不一致。

问题1、2的解决方式:

借助转账日志表

-----------------------------------------------------------------------------

二次修改后的部分流程:

1、A银行对转出账户进行检查,扣除金额。同时向日志表写入操作,状态为“待处理”(通过本地事务保证两个操作原子性)

2、将对B银行的请求写入异步消息队列,主线程返回

3、启动后台程序从队列中获取待处理数据

4、后台程序对B进行远程调用

……

出现问题后的处理:

第一步写入日志表后,操作已经持久化。若写入消息队列失败,只需加入后台线程补偿(周期性读取日志表,时间大于某个阈值且状态仍未“待处理”时, 重写消息队列)

处理流程图如下:

同样,对B银行也需要增加一个转账日志表,就可以保证分布式事务的一致性。

最终处理流程图如下:

解决分布式事务一致性的核心:

A银行通过本地事务保证日志记录 + 后台线程轮询保证消息不丢失

B银行通过本地事务保证日志记录,进而保证消息不重复

B银行回调A接口时,返回处理结果,若转账失败则回滚

原文地址:https://www.cnblogs.com/cyx-qk/p/11082726.html

时间: 2024-10-01 02:23:31

分布式事务的思考与理解的相关文章

(转)一次给女朋友转账引发我对分布式事务的思考

本文在个人技术博客不同步发布,详情可用力戳亦可扫描屏幕右侧二维码关注个人公众号,公众号内有个人联系方式,等你来撩...    前两天发了工资,第一反应是想着要给远方的女朋友一点惊喜!于是打开了平安银行的APP给女朋友转点钱!填写上对方招商银行卡的卡号.开户名,一键转账!搞定!在我点击的那瞬间,就收到了app的账户变动的提醒,并且出现了图一所示的提示界面:“处理中,正在等待对方银行返回结果…”.嗯!毕竟是跨行转账嘛,等个几秒也正常!脑海开始浮现出女朋友收到转账后惊喜与感动的画面!        然

从银行转账失败到分布式事务:总结与思考

目录 关系型数据库事务 分布式事务 2PC 3PC TCC 基于消息的分布式事务 1PC 思考与总结 references 正文 思考这个问题的初衷,是有一次给朋友转账,结果我的钱被扣了,朋友没收到钱.而我之前一直认为银行转账一定是由事务保证强一致性的,于是学习.总结了一下分布式事务的各种理论.方法. 事务是一个非常广义的词汇,各行各业解读都不一样.对于程序员,事务等价于Transaction,是指一组连续的操作,这些操作组合成一个逻辑的.完整的操作.即这组操作执行前后,系统需要处于一个可预知的

聊聊分布式事务&分布式系统事务一致性解决方案

事务就是一个会话过程中,对上下文的影响是一致的,要么所有的更改都做了,要么所有的更变都撤销掉.就要么生,要么死.没有半死不死的中间不可预期状态. 参考下薛定谔的猫. 事务是为了保障业务数据的完整性和准确性的. 分布式事务,常见的两个处理办法就是两段式提交和补偿. 两段式提交典型的就是XA,有个事务协调器,告诉大家,来都准备好提交,大家回复,都准备好了,然后协调器告诉大家,一起提交,大家都提交了. 补偿比较好理解,先处理业务,然后定时或者回调里,检查状态是不是一致的,如果不一致采用某个策略,强制状

分布式事务一致性方案

http://www.infoq.com/cn/articles/solution-of-distributed-system-transaction-consistency 在OLTP系统领域,我们在很多业务场景下都会面临事务一致性方面的需求,例如最经典的Bob给Smith转账的案例.传统的企业开发,系统往往是以单体应用形式存在的,也没有横跨多个数据库.我们通常只需借助开发平台中特有数据访问技术和框架(例如Spring.JDBC.ADO.NET),结合关系型数据库自带的事务管理机制来实现事务性

分布式事务及分布式系统一致性解决方案

在分布式系统中,同时满足"一致性"."可用性"和"分区容错性"三者是不可能的.分布式系统的事务一致性是一个技术难题,各种解决方案孰优孰劣? 在OLTP系统领域,我们在很多业务场景下都会面临事务一致性方面的需求,例如最经典的Bob给Smith转账的案例.传统的企业开发,系统往往是以单体应用形式存在的,也没有横跨多个数据库. 我们通常只需借助开发平台中特有数据访问技术和框架(例如Spring.JDBC.ADO.NET),结合关系型数据库自带的事务管理

分布式事务系列(开篇)提出疑问和研究过程

1 前言 对于我们这种初学者,可能会使用spring带给我们的@Transactional,可能了解JTA,可能会使用jotm.atomikos,又会遇到一些名词XA,支持XA的数据库驱动等等诸多问题,然后就会愈加混乱,自然形成一个疑问,庞大的事务体系的全貌到底是什么样? 2 需要解决的疑惑 下面就要具体列出一系列需要解决的问题 2.1 对于事务模型 三种事务模型是什么?各自的特点是什么?各自的缺陷是什么? 2.2 spring对于事务模型的支持 spring自己的一系列接口设计: Platfo

分布式事务——【新生入学系统】

前言 了解分布式事务之前,先要明白事务到底是一个什么东西.事务(Transaction)就像搞对象,要么做男女朋友,要么就做陌生人,没有好朋友这么一说. 官方解释:事务提供了一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元,组成事务的所有操作只有在所有操作均能正常执行的情况下方能提交,只要其中任一操作执行失败,都将导致整个事务的回滚.简单说:事务提供了一种"要么不做,要么全做"的机制.瞬间感觉,事务有了东北大老爷们的气概- 事务特性 原子性(Atomicity).一致性(C

搞懂分布式技术17,18:分布式事务总结

搞懂分布式技术17:浅析分布式事务 众所周知,数据库能实现本地事务,也就是在同一个数据库中,你可以允许一组操作要么全都正确执行,要么全都不执行.这里特别强调了本地事务,也就是目前的数据库只能支持同一个数据库中的事务.但现在的系统往往采用微服务架构,业务系统拥有独立的数据库,因此就出现了跨多个数据库的事务需求,这种事务即为"分布式事务".那么在目前数据库不支持跨库事务的情况下,我们应该如何实现分布式事务呢?本文首先会为大家梳理分布式事务的基本概念和理论基础,然后介绍几种目前常用的分布式事

从银行微信约战棋牌源码下载转账失败到分布式事务:总结与思考

思考这微信约战棋牌源码下载( h5.super-mans.com Q:2012035031)微信约战棋牌源码下载个问题的初衷,是有一次给朋友转账,结果我的钱被扣了,朋友没收到钱.而我之前一直认为银行转账一定是由事务保证强一致性的,于是学习.总结了一下分布式事务的各种理论.方法. 事务是一个非常广义的词汇,各行各业解读都不一样.对于程序员,事务等价于Transaction,是指一组连续的操作,这些操作组合成一个逻辑的.完整的操作.即这组操作执行前后,系统需要处于一个可预知的.一致的状态.因此,这一