分布式事务及解决方案

分布式事务及解决方案

要了解分布式事务,我们要先清楚什么是事务。事务就是多个原子操作的组合,他们就像是一条绳上的蚂蚱,要么一起生,要么一起死,在事务中,如果其中一个操作执行失败,那么剩下的操作都不再执行,而之前执行过的操作也需要回滚。至于分布式事务,顾名思义就是包含对分布式系统中不同节点的操作的事务。

事务的目的

我们使用事务的目的是为了防止一些执行失败的操作对数据造成影响,产生错误数据。比较典型的例子就是转账、下订单等关于交易的事务。比如转账业务,我们从A账户转账500块钱给B账户,那么这一条事务的操作就是:从A账户减去500块钱;向B账户中增加500块钱。如果我们执行第一个操作成功,从A账户中扣除了500块钱,但是执行第二个操作失败,B账户中没有增加500块钱。这样子就产生了错误数据,500块钱“凭空消失”了。这时我们就需要使用事务,当第二个操作执行失败后,我们将第一个操作进行回滚,将从A账户中减去的500块钱“还回去”,这样子就保证了数据的正确性。

事务的特性

事务有原子性、一致性、隔离性、持久性四个特性,取英文名的首字母,简称为ACID特性。

1.原子性(atomicity):一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。

2.一致性(consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。

3.隔离性(isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

4.持久性(durability):持久性也称永久性,指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

CAP理论

CAP理论:一个分布式系统不可能同时满足一致性,可用性和分区容错性这个三个基本需求,最多只能同时满足其中两项

一致性©:数据在多个副本之间是否能够保持一致的特性。

可用性(A):是指系统提供的服务必须一致处于可用状态,对于每一个用户的请求总是在有限的时间内返回结果,超过时间就认为系统是不可用的

分区容错性§:分布式系统在遇到任何网络分区故障的时候,仍然需要能够保证对外提供满足一致性和可用性的服务,除非整个网络环境都发生故障。

CAP定理的应用

放弃P(CA):如果希望能够避免系统出现分区容错性问题,一种较为简单的做法就是将所有的数据(或者是与事物先相关的数据)都放在一个分布式节点上,这样虽然无法保证100%系统不会出错,但至少不会碰到由于网络分区带来的负面影响

放弃A(CP):其做法是一旦系统遇到网络分区或其他故障时,那受到影响的服务需要等待一定的时间,应用等待期间系统无法对外提供正常的服务,即不可用

放弃C(AP):这里说的放弃一致性,并不是完全不需要数据一致性,是指放弃数据的强一致性,保留数据的最终一致性。

BASE思想

事务的特性是ACID特性,然后我们由CAP定理可知,如果要保证分布式系统的分区容错性,那么一致性和可用性是不可兼得的,但是在分布式系统中缺少任何一个可能都会造成很大影响,为了处理这种情况,就有了BASE思想。

BASE思想是通过牺牲强一致性来满足可用性,然后通过达到最终一致性来保证数据的正确性。BASE思想包含如下三个元素:

1.BA(Basically Available):基本可用,允许损失部分可用性。

2.S(Soft State):软状态,状态可以在一段时间内不同步。

3.E(Eventually Consistent):最终一致,允许在一段时间内数据不一致,数据最终达到一致即可。

软状态是实现BASE思想的方法,基本可用和最终一致是BASE思想的目标。比如在事务的目的中所提的转账的例子,当执行第二个操作时失败,这时我们不回滚第一个操作,然后我们将失败的B操作记录下来,在一定时间内将其执行,这样子就保证了最终一致性。

分布式一致性协议

1.两阶段提交协议(2PC):

在分布式事务中,一个事务贯穿多个节点,每个节点仅仅知道自己操作的结果,但是并不知道其它节点的操作结果。为了保证事务的一致性,就需要一个统一的协调者,每个节点把操作的结果告知协调者,协调者再根据操作结果再通知各节点是将操作提交还是取消操作,下图是执行成功的示例:

在这里插入图片描述
两阶段提交协议有准备阶段和提交阶段两个阶段,可以保证强一致性,但是复杂,不够灵活,而且还有以下缺点:阻塞(每个节点必须收到响应才会继续向下执行,否则则一直处于阻塞状态,占用资源),节点故障(如果在执行事务的过程中有节点发生故障,则协调者只能等待,会阻塞其他节点资源,而如果发生这种情况后,协调者也发生故障,新选取的协调者无法处理这种情况)。

2.三阶段提交协议(3PC):

三阶段提交协议是两阶段提交协议的改进,目的是解决两阶段协议的缺点。它加入了超时机制来解决两阶段协议的阻塞问题,并在准备阶段前增加了询问阶段(协调者询问节点是否可以提交,节点只需要返回是或否即可)。如果发生响应超时的问题,则可以回滚,不会使节点进入阻塞状态等待。

三阶段提交协议的缺点是需要更多的通讯次数,实现比较复杂。两阶段提交协议和三阶段提交协议都是强一致性的分布式事务解决方案。

分布式事务最终一致性解决方案

1.可靠消息服务:

下图是一个简单的可靠消息服务的设计,通过这张图可以简单的了解一下可靠消息服务的思路。

在这里插入图片描述
由上图可以看出,可靠消息服务分为以下三步(括号内为执行失败的情况):

(1)系统A执行操作前先将消息发送给消息系统,系统A在执行完操作后,将确认消息发送给消息系统。(如果系统A执行失败,或者由于网络原因,消息系统一直没有收到确认消息,则将该条消息返回给系统A做处理)

(2)消息系统将消息投递给系统B执行,系统B将执行结果返回给消息系统。(在这里系统B可能执行失败,也可能受网络等因素,消息系统接收到一个失败的结果,遇到这种情况,则重复向系统B投递消息)

(3)如果消息系统收到系统B返回的成功的执行结果,则事务执行成功。(如果消息系统重复投递消息,一直收到失败的结果,超过一定次数后,则认为执行失败,将该条消息存入死信队列,做特殊处理)

可靠消息服务保证消息一直是可靠的,可执行的。所以系统A在执行前先将消息发送给消息系统,执行成功后再发送确认消息,确保系统A成功执行后,消息系统才会将消息发送到B系统,保证消息的可执行性;投递到B系统的消息执行失败后重复投递,超过一定次数后采用补偿模式,做特殊处理,保证消息的可靠性。

2.最大努力通知:

最大努力通知是一种简单的分布式事务最终一致性解决方案,适用于时间敏感度低的业务,且被动方的处理结果不会影响到主动方。

通过下图可以简单的了解一下最大努力通知的执行过程:

在这里插入图片描述
由上图可以看出最大努力通知分为以下三步:

(1)主动方执行完业务之后,将消息发送给消息系统。

(2)消息系统将消息通知给被动方,被动方执行成功后响应给消息系统,事务执行成功。(如果消息系统通知消息失败,则重复通知,失败超过一定次数后则不再通知,消息丢失)

(3)被动方根据定时策略主动向主动方发起校对查询,对丢失的消息进行恢复。

最大努力通知的解决方案在事务的执行过程中,消息的传递允许发生丢失,所以消息是不可靠的;被动方根据定时策略,采用补偿模式,主动向主动方发起校对查询(主动方提供校对查询接口),恢复丢失的业务消息。

3.TCC模式:

TCC模式分为Try、Confirm、Cancle三个步骤,它的执行流程简单来说就是:先执行Try操作,如果执行成功,则执行Confirm操作,如果执行过程中出现问题,则执行Cancle操作。TCC模式可以说是一个改进版的两阶段提交协议,但是在执行过程中出现问题时有一定的自我修复能力,如果任何参与者出现了问题,则协调者通过执行Cancel操作来取消之前的操作,达到最终的一致状态。

通过下图可以简单的了解一下TCC模式的执行过程:

在这里插入图片描述
(1)应用服务先向各服务提交Try操作,发起预留资源请求,然后执行任务。

(2)如果应用服务执行任务正常,并且各服务都对Try操作返回了OK,管理器则向各服务发起Confirm操作,如果各服务都对Confirm操作返回了OK,事务结束。

(3)如果Try阶段有其中某个服务执行出现了问题,管理器就向各服务发起Cancle操作,来取消操作,释放预留的资源,保证了一致性。如果Confirm阶段有某个服务执行出现了问题,则进行补偿操作。

TCC模式是对两阶段提交协议的一个改进,也是对三阶段提交协议的一个简化。相比较于两阶段提交协议,它首先进行Try操作,询问是否可以预留资源,不会像两阶段提交协议那样长时间占用资源,容易造成阻塞;相比较于三阶段提交协议,它相当于把准备阶段和提交阶段合起来了,相比较于三阶段提交协议通讯次数较少,较为简化。

关于本书 本书是针对中高级的专业和准专业的程序开发人员而编写的。全书共分五篇:第一篇简要介绍了分布式结构及Delphi 6对 它的支持;第二篇讲述了分布式组件的实现,篇中分别讲述了DCOM架构的基元——COM的编程基础,创建DCOM客户端用& 务器应用以及COM十分布式应用的开发;第三篇讲了另一种分布式技术CORBA的原理及实现;第四篇讲多层分布式数据库系 统,从数据库的链接讲起,由浅入深地讲了MIDAS的概念,它的DCOM及CORBA的实现方式,最后深入剖析了它的结构;第五 篇讲了分布式Web技术,包括现在流行的 Web技术及 Internet Express的应用。本书的各个部分,都辅之有详尽的例子, 您会一步步学习构建各种分布式应用程序。相信,在仔细研读和亲手实践了这些程序之后,您一定会成为分布式开发的能 手。由于计算机技术的可操作性很强,所以,在本书的学习过程中,希望读者一定要亲手操作,边看书边实践,这样才会 达到更好的学习效果。 第一篇 分布式结构介绍 第1章 分布式结构与多层应用系统概述 1.1 分布式结构简介 1.1.1 现有的分布式结构 1.1.2 各种分布式结构的比较 1.2 分布式结构的优点 1.3 多层应用系统介绍 1.4 分布式应用的意义 1.5 用delphi进行分布式应用程序的开发 1.5.1 delphi 6支持的分布式组件技术 1.5.2 开发midas应用 1.5.3 开发分布式web技术 第二篇 delphi 6的 comidcom/com十编程 第 2章 delphi 6的 com编程基础 2.1 com的概念及特性 2.1.1 com简介 2.1.2 com的特性 2.1.3 com的优点 2.2 创建com对象 2.2.l 规划com对象 2.2.2 com对象向导 2.2.3 automation对象向导 2.2.4 定义接口 2.2.5 注册com对象 2.2.6 测试com服务程序 2.3 对象接口介绍 2.3.l 接口的作用 2.3.2 接口的语法 2.3.3 iunknown接口 2.3.4 接口的实现 2.3.5 接口的引用 2.3.6 双重接口 2.4 type library的使用 2.4.1 type library编辑器介绍 2.4.2 type librny的基本操作 第3章 com的高级技术 3.1 dll中对象的实现 3.1.l 编写dll的一般方法 3.1.2 dll的创建 3.1.3 应用程序的创建 3.2 com接口的实现 3.2.1 tinterfacedobject类的接口实现 3.2.2 tinterfacedobject类的多接口实现 3.3 利用类型库进行com编程 3.3.l typedcomobject类概述 3.3.2 创建dll服务程序 3.3.3 创建客户应用程序 第4章 创建dcom客户端用&务器应用 4.1 dcom系统结构及技术特性 4.1.1 dcom的系统结构 4.1.2 dcom的技术特性 4.1.3 com与dcom的比较 4.2 dcom服务器的创建 4.2.l 创建自动化对象 4.2.2 dcom服务器的安装 4.3 dcom客户程序的创建 第5章 com十分布式应用的开发 5.1 com十系统构架 5.1.1 com十简介 5.1.2 com十的系统构架 5.2 com十组件的开发 5.3 客户应用程序的开发 第三篇 delphi 6的 corba编程 第6章 corba编程基础 6.1 corba技术简介 6.2 coana的基本概念 6.2.1 corba对象 6.2.2 接口定义语言idl 6.2.3 对象请求代理orb 6.2.4 根程序stub和框架程序skeleton 6.3 delphi 6对 corba的支持 6.3.1 visibroker技术 6.3.2 sined agent 6.3.3 corba对象接口的实现 6.4 delphi 6中开发 corba的工具介绍 6.4.1 type librny编辑器 6.4.2 支持coana中的类 6.4.3 corba对象向导 6.4.4 corba数据模块向导 6.4.5 coana clientheerver应用程序 6.5 corba对象向导的使用 6.5.1 解析 corba对象向导 6.5.2 创建corba服务器 6.5.3 创建客户程序 6.6 多线程corba应用的开发 6.6.1 创建支持多线程的corba对象 6.6.2 客户端程序的开发 第7章 高级corba编程 7.1 idl语言基础 7.1.1 一个典型的idl 7.1.2 idl常规术语 7.l.3 idl语法 7.l.4 corba模块 7.2 开发corba高级应用程序 7.3 corba客户端/服务器应用程序向导的使用 7.3.1 idl文件的生成 7.3.2 创建corba服务器 7.3.3 创建corba客户应用程序 第四篇 多层分布式数据库系统midas的开发 第8章 数据库的链接 8.l 数据库的建立 8.2 数据库应用程序的开发步骤 8.3 delphi 6数据库应用开发概述 8.3.1 boriand数据库引擎bde 8.3.2 数据库工具 sql explorer 8.3.3 用bde链接本地数据库的一个简单例子 8. 3. 4 delphi中数据存取总结 8.4 odbc技术 8.4.1 odbc的创建 8.4.2 odbc的概念 8.4.3 odbc解决方案 8.4.4 odbc总体结构 8.5 ado 8.5.1 ado本地数据访问的解决方案 8.5.2 基本的ado编程模型 8.5.3 远程数据访问rds的解决方案 8.5.4 delphi 6中的 tado组件的介绍 8.5.5 一个ado具体的例子 8.6 interbase数据库服务器及ibx组件 8.6.1 inierbase的简要介绍 8.6.2 一个ibx的例子 8.7 多层应用处理数据的一些技巧 8.7.1 数据库链接中的 connection pooling链接技术 8.7.2 多层应用处理数据的原理 8.7.3 处理大型数据集的技巧 第9章 用dcom数据模块来实现基本多层分布式系统 9. l 平滑过渡到h层体系结构 9.2 关于多层应用程序 9·3 delphi 6开发基本多层分布式系统 9.3.1 配置数据库 9.3.2 创建应用服务器 9.3.3 创建客户应用程序 9.4 本地数据库查询操作localquers 9.5 delphi 6开发基本多层分布式系统详解 9.5.1 简单应用服务器程序的具体设置 9.5.2 简单客户端程序的具体设置 第10章 midas的高级应用开发 10.1 在 delphi 6开发 midas三层应用程序 10.1.1 在 delphi 6中创建应用服务器 10.1. 2 在delphi 6中创建客户程序 10.1.3 与应用服务器链接 10.1.4 调用服务器上的接口 10.1.5 在客户端纠错 10. 1.6 更新数据 10.2 midas多层应用程序的开发 10. 2.1 delphi 6中无状态的中间层数据存取 10. 2.2 多层体系结构下的事务 10.2.3 一个基本的midas例子 10.2.4 公文包模式介绍以及具体例子 10.2.5 datapooler技术的例子 10. 3 在 midas中使用 activex 10. 3.1 activex控件开发过程 10.3.2 扩展 activex 10.3.3 注册和安装 10. 3.4 发布 activex 10.3.5 一个 midas的 activexform例子 第11章 用 corba数据模块来实现 midas 11.1 corba数据模块向导介绍 11.2 corba服务器的创建 11.2.1 创建 corba数据模块 11.2.2 添加 corba数据模块组件 11.2.3 运行 coana服务器 11.3 客户程序的创建 11.3.1 程序窗体设计 11.3.2 组件设置 11.3.3 添加代码 11.3.4 运行程序 第五篇 分布式web应用开发 第12章 分布式 web应用开发 12.1 现有 web技术 12.1.1 html技术 12.1.2 javascript技术 12.l.3 asp技术 12.1.4 cgi技术 12.1.5 isapi技术 12.2 用internetexpress开发web分布式应用 12.2.1 delphi 6对传统 web技术的支持 12.2.2 internetexpress工作原理 12.2.3 internetexpress组件介绍 12.2.4 web服务器和 internetexpress的通信 12.2.5 internetexpress实用编程 12.3 开发web服务 12.3.1 web服务概念 12.3.2 web服务协议 12.3.3 web服务应用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值