`

分布式数据库事务

阅读更多

事务的ACID特性

 

原子性(A)

所谓的原子性就是说,在整个事务中的所有操作,要么全部完成,要么全部不做,没有中间状态。对于事务在执行中发生错误,所有的操作都会被回滚,整个事务就像从没被执行过一样。

一个事务包含多个操作,这些操作要么全部执行,要么全都不执行。实现事务的原子性,要支持回滚操作,在某个操作失败后,回滚到事务执行之前的状态。
回滚实际上是一个比较高层抽象的概念,大多数DB在实现事务时,是在事务操作的数据快照上进行的(比如,MVCC),并不修改实际的数据,如果有错并不会提交,所以很自然的支持回滚。而在其他支持简单事务的系统中,不会在快照上更新,而直接操作实际数据。可以先预演一边所有要执行的操作,如果失败则这些操作不会被执行,通过这种方式很简单的实现了原子性。

 

一致性(C)

事务的执行必须保证系统的一致性,就拿转账为例,A有500元,B有300元,如果在一个事务里A成功转给B50元,那么不管并发多少,不管发生什么,只要事务执行成功了,那么最后A账户一定是450元,B账户一定是350元。

一致性是指事务使得系统从一个一致的状态转换到另一个一致状态。事务的一致性决定了一个系统设计和实现的复杂度。事务可以不同程度的一致性:

强一致性:读操作可以立即读到提交的更新操作。

弱一致性:提交的更新操作,不一定立即会被读操作读到,此种情况会存在一个不一致窗口,指的是读操作可以读到最新值的一段时间。

最终一致性:是弱一致性的特例。事务更新一份数据,最终一致性保证在没有其他事务更新同样的值的话,最终所有的事务都会读到之前事务更新的最新值。如果没有错误发生,不一致窗口的大小依赖于:通信延迟,系统负载等。

其他一致性变体还有:

单调一致性:如果一个进程已经读到一个值,那么后续不会读到更早的值。

会话一致性:保证客户端和服务器交互的会话过程中,读操作可以读到更新操作后的最新值。

 

隔离性(I)

所谓的隔离性就是说,事务与事务之间不会互相影响,一个事务的中间状态不会被其他事务感知。

并发事务之间互相影响的程度,比如一个事务会不会读取到另一个未提交的事务修改的数据。在事务并发操作时,可能出现的问题有:

脏读:事务A修改了一个数据,但未提交,事务B读到了事务A未提交的更新结果,如果事务A提交失败,事务B读到的就是脏数据。

不可重复读:在同一个事务中,对于同一份数据读取到的结果不一致。比如,事务B在事务A提交前读到的结果,和提交后读到的结果可能不同。不可重复读出现的原因就是事务并发修改记录,要避免这种情况,最简单的方法就是对要修改的记录加锁,这回导致锁竞争加剧,影响性能。另一种方法是通过

另一种方法是通过MVCC可以在无锁的情况下,避免不可重复读。
幻读:在同一个事务中,同一个查询多次返回的结果不一致。事务A新增了一条记录,事务B在事务A提交前后各执行了一次查询操作,发现后一次比前一次多了一条记录。幻读是由于并发事务增加记录导致的,这个不能像不可重复读通过记录加锁解决,因为对于新增的记录根本无法加锁。需要将事务串行化,才能避免幻读。

事务的隔离级别从低到高有:

ReadUncommitted:最低的隔离级别,什么都不需要做,一个事务可以读到另一个事务未提交的结果。所有的并发事务问题都会发生。

ReadCommitted:只有在事务提交后,其更新结果才会被其他事务看见。可以解决脏读问题。

RepeatedRead:在一个事务中,对于同一份数据的读取结果总是相同的,无论是否有其他事务对这份数据进行操作,以及这个事务是否提交。可以解决脏读、不可重复读。

Serialization:事务串行化执行,隔离级别最高,牺牲了系统的并发性。可以解决并发事务的所有问题。

通常,在工程实践中,为了性能的考虑会对隔离性进行折中。

 

持久性(D)

所谓的持久性,就是说一单事务完成了,那么事务对数据所做的变更就完全保存在了数据库中,即使发生停电,系统宕机也是如此。

 

参考 http://blog.csdn.net/chosen0ne/article/details/10036775

 

分布式全局事务模型 DTP

X/Open DTP 定义了三个组件: AP,TM,RM

AP(Application Program):也就是应用程序,可以理解为使用DTP的程序

RM(Resource Manager):资源管理器,这里可以理解为一个DBMS系统,或者消息服务器管理系统,应用程序通过资源管理器对资源进行控制。资源必须实现XA定义的接口

TM(Transaction Manager):事务管理器,负责协调和管理事务,提供给AP应用程序编程接口以及管理资源管理器

其中,AP 可以和TM 以及 RM 通信,TM 和 RM 互相之间可以通信,DTP模型里面定义了XA接口,TM 和 RM 通过XA接口进行双向通信,例如:TM通知RM提交事务或者回滚事务,RM把提交结果通知给TM。AP和RM之间则通过RM提供的Native API 进行资源控制,这个没有进行约API和规范,各个厂商自己实现自己的资源控制,比如Oracle自己的数据库驱动程序。

跨数据库事务:2PC (two-phase commit), 2PC is the anti-scalability pattern (Pat Helland) 是反可伸缩模式的,JavaEE中的JTA事务可以支持2PC。因为2PC是反模式,尽量不要使用2PC,使用BASE来回避。

一直以来,MySQL数据库是支持分布式事务的,但是只能说是有限的支持,具体表现在:

已经prepare的事务,在客户端退出或者服务宕机的时候,2PC的事务会被回滚

在服务器故障重启提交后,相应的Binlog被丢失

 

上述问题存在于MySQL数据库长达数十年的时间,直到MySQL-5.7.7版本,官方才修复了该问题。 虽然InnoSQL早已在5.5版本修复,但是对比官方的修复方案,我们真的做的没有那么的优雅 。下面将会详细介绍下该问题的具体表现和官方修复方法,这里分别采用官方MySQL-5.6.27版本(未修复)和MySQL-5.7.9版本(已修复)进行验证。

 

具体参考下面链接

http://www.cnblogs.com/aigongsi/archive/2012/10/11/2718313.html

 

分布式系统的BASE理论



eBay的架构师Dan Pritchett源于对大规模分布式系统的实践总结,在ACM上发表文章提出BASE理论,BASE理论是对CAP理论的延伸,核心思想是即使无法做到强一致性(Strong Consistency,CAP的一致性就是强一致性),但应用可以采用适合的方式达到最终一致性(Eventual Consitency)。

BASE是指基本可用(Basically Available)、软状态( Soft State)、最终一致性( Eventual Consistency)。

BASE是指基本可用(Basically Available)

基本可用是指分布式系统在出现故障的时候,允许损失部分可用性,即保证核心可用。

电商大促时,为了应对访问量激增,部分用户可能会被引导到降级页面,服务层也可能只提供降级服务。这就是损失部分可用性的体现。

软状态( Soft State)

软状态是指允许系统存在中间状态,而该中间状态不会影响系统整体可用性。分布式存储中一般一份数据至少会有三个副本,允许不同节点间副本同步的延时就是软状态的体现。mysql replication的异步复制也是一种体现。

最终一致性( Eventual Consistency)

最终一致性是指系统中的所有数据副本经过一定时间后,最终能够达到一致的状态。弱一致性和强一致性相反,最终一致性是弱一致性的一种特殊情况。

 

分布式系统的CAP理论

参考

http://blog.csdn.net/chen77716/article/details/30635543

 

 

柔性事务

1.TCC(两阶段)使用场景:转账。

2.最大努力通知 使用场景:对最终一致性时间不敏感,向调用发发送信息可丢失(可多次发送),提供调用方查询的借口。常用语系统间的调用。

3.补偿操作 使用场景:用积分和余额同时支付,先扣除积分但余额扣除失败时再把积分加回来。

4.基于可靠消息的最新一直性

 

基于消息的最终一致性

 

所谓的消息事务就是基于消息中间件的两阶段提交,本质上是对消息中间件的一种特殊利用,它是将本地事务和发消息放在了一个分布式事务里,保证要么本地操作成功成功并且对外发消息成功,要么两者都失败,开源的RocketMQ就支持这一特性,具体原理如下:

 1、A系统向消息中间件发送一条预备消息

2、消息中间件保存预备消息并返回成功
3、A执行本地事务
4、A发送提交消息给消息中间件

通过以上4步完成了一个消息事务。对于以上的4个步骤,每个步骤都可能产生错误,下面一一分析:

  • 步骤一出错,则整个事务失败,不会执行A的本地操作
  • 步骤二出错,则整个事务失败,不会执行A的本地操作
  • 步骤三出错,这时候需要回滚预备消息,怎么回滚?答案是A系统实现一个消息中间件的回调接口,消息中间件会去不断执行回调接口,检查A事务执行是否执行成功,如果失败则回滚预备消息
  • 步骤四出错,这时候A的本地事务是成功的,那么消息中间件要回滚A吗?答案是不需要,其实通过回调接口,消息中间件能够检查到A执行成功了,这时候其实不需要A发提交消息了,消息中间件可以自己对消息进行提交,从而完成整个消息事务

 基于消息中间件的两阶段提交往往用在高并发场景下,将一个分布式事务拆成一个消息事务(A系统的本地操作+发消息)+B系统的本地操作,其中B系统的操作由消息驱动,只要消息事务成功,那么A操作一定成功,消息也一定发出来了,这时候B会收到消息去执行本地操作,如果本地操作失败,消息会重投,直到B操作成功,这样就变相地实现了A与B的分布式事务。原理如下:

 参考于http://www.cnblogs.com/leetieniu2014/p/5639528.html

 

使用消息队列来避免分布式事务
  如果仔细观察生活的话,生活的很多场景已经给了我们提示。
  比如在北京很有名的姚记炒肝点了炒肝并付了钱后,他们并不会直接把你点的炒肝给你,往往是给你一张小票,然后让你拿着小票到出货区排队去取。
为什么他们要将付钱和取货两个动作分开呢?原因很多,其中一个很重要的原因是为了使他们接待能力增强(并发量更高)。

还是回到我们的问题,只要这张小票在,你最终是能拿到炒肝的。同理转账服务也是如此,当用户A账户扣除1万后,
我们只要生成一个凭证(消息)即可,这个凭证(消息)上写着“让用户B账户增加 1万”,只要这个凭证(消息)能可靠保存,
我们最终是可以拿着这个凭证(消息)让用户B账户增加1万的,即我们能依靠这个凭证(消息)完成最终一致性。

4.1 如何可靠保存凭证(消息)

  有两种方法:

4.1.1 业务与消息耦合的方式

  用户A在完成扣款的同时,同时记录消息数据,这个消息数据与业务数据保存在同一数据库实例里(消息记录表表名为message);

1
2
3
4
5
<span style="color: #000000;">Begin transaction
update A set amount</span>=amount-10000 where userId=1<span style="color: #000000;">;
insert into message(userId, amount,status) values(</span>1, 10000, 1<span style="color: #000000;">);
End transaction
commit;</span>

  上述事务能保证只要用户A账户里被扣了钱,消息一定能保存下来。

  当上述事务提交成功后,我们通过实时消息服务将此消息通知用户B,用户B处理成功后发送回复成功消息,用户A收到回复后删除该条消息数据。

4.1.2 业务与消息解耦方式

  上述保存消息的方式使得消息数据和业务数据紧耦合在一起,从架构上看不够优雅,而且容易诱发其他问题。为了解耦,可以采用以下方式。

  1)用户A在扣款事务提交之前,向实时消息服务请求发送消息,实时消息服务只记录消息数据,而不真正发送,只有消息发送成功后才会提交事务;

  2)当用户A扣款事务被提交成功后,向实时消息服务确认发送。只有在得到确认发送指令后,实时消息服务才真正发送该消息;

  3)当用户A扣款事务提交失败回滚后,向实时消息服务取消发送。在得到取消发送指令后,该消息将不会被发送;

  4)对于那些未确认的消息或者取消的消息,需要有一个消息状态确认系统定时去用户A系统查询这个消息的状态并进行更新。为什么需要这一步骤,
举个例子:假设在第2步用户A扣款事务被成功提交后,系统挂了,此时消息状态并未被更新为“确认发送”,从而导致消息不能被发送。

  优点:消息数据独立存储,降低业务系统与消息系统间的耦合;

  缺点:一次消息发送需要两次请求;业务处理服务需要实现消息状态回查接口。

4.2 如何解决消息重复投递的问题

  还有一个很严重的问题就是消息重复投递,以我们用户A转账到用户B为例,如果相同的消息被重复投递两次,那么我们用户B账户将会增加2万而不是1万了。

  为什么相同的消息会被重复投递?比如用户B处理完消息msg后,发送了处理成功的消息给用户A,正常情况下用户A应该要删除消息msg,但如果用户A这时候悲剧的挂了,
重启后一看消息msg还在,就会继续发送消息msg。

  解决方法很简单,在用户B这边增加消息应用状态表(message_apply),通俗来说就是个账本,用于记录消息的消费情况,每次来一个消息,
在真正执行之前,先去消息应用状态表中查询一遍,如果找到说明是重复消息,丢弃即可,如果没找到才执行,同时插入到消息应用状态表(同一事务)。

1
2
3
4
5
6
7
8
for each msg in queue
Begin transaction
select count(*) as cnt from message_apply where msg_id=msg.msg_id;
if cnt==0 then
update B set amount=amount+10000 where userId=1;
insert into message_apply(msg_id) values(msg.msg_id);
End transaction
commit;

参考http://www.cnblogs.com/baiwa/p/5328722.html

 

幂等性:

应用在软件系统中,我把它简单定义为:某个函数或者某个接口使用相同参数调用一次或者无限次,其造成的后果是一样的,在实际应用中一般针对于接口进行幂等性设计。举个栗子,在系统中,调用方A调用系统B的接口进行用户的扣费操作时,由于网络不稳定,A重试了N次该请求,那么不管B是否接收到多少次请求,都应该保证只会扣除该用户一次费用。

刚性事务:

 

 

 

 

 

  • 大小: 22 KB
  • 大小: 22 KB
分享到:
评论

相关推荐

    分布式数据库事务处理(COM+实现)

    分布式数据库事务处理是数据库系统中的一个重要概念,尤其是在大型企业级应用和互联网服务中,它能够保证数据的一致性和完整性,即使在多台计算机之间进行数据操作。COM+(Component Object Model Plus)是微软提出...

    基于移动代理的分布式数据库事务处理算法设计.pdf

    分布式数据库事务处理是一个涉及网络中多个数据库节点的数据操作,要求在保证数据一致性的同时,实现事务的原子性、一致性、隔离性和持久性(即ACID特性)。随着互联网和分布式应用的快速发展,传统集中式数据库事务...

    分布式数据库事务分类策略研究.pdf

    【分布式数据库事务分类策略研究】 在现代信息技术领域,随着数据量的不断增长,传统的集中式数据库系统已经无法满足高并发、大数据量的处理需求。分布式数据库作为一种有效的解决方案,通过将数据分散存储在多个...

    分布式数据库课后习题答案整理

    7. 事务管理的分布性:分布式数据库系统可以提供分布式的事务管理机制,以提高系统的可靠性。 分布式数据库系统的概念模式: 1. 全局概念模式:描述分布式数据库中全局数据的逻辑结构和数据特性。 2. 分片模式:...

    分布式数据库--30讲

    分布式数据库的学习路径可以从数据库开始,包括存储设计、事务模型、查询引擎、复制和其他几个方面。学习分布式数据库可以帮助我们更好地理解数据库的设计思想和架构设计。 分布式数据库的优点包括: 1. 高性能:...

    分布式数据库事务处理资料

    ### 分布式数据库事务处理资料知识点解析 #### 标题:分布式数据库事务处理资料 - **核心内容**:本文档提供了关于分布式事务处理的核心技术标准,重点在于介绍X/Open公司的XA规范。 #### 描述:这应该是目前最...

    分布式数据库试题及答案西南交大研究生

    分布式数据库事务处理是指处理分布式数据库的事务操作,包括事务的提交和回滚等方面。 在本试题中,我们将讨论分布式数据库事务处理,包括串行调度和并发控制等方面。 (1)串行调度 串行调度是指将事务操作序列...

    分布式数据库第三版所有课件及相关资料 徐俊刚版

    其次,分布式数据库的事务处理是一个关键挑战。ACID(原子性、一致性、隔离性、持久性)特性在分布式环境下需要重新设计和实现,如两阶段提交、多阶段提交等协议确保了分布式事务的一致性。同时,CAP理论指出,...

    东北大学申德荣分布式数据库系统原理与应用讲义

    分布式数据库系统原理与应用 ...总结,申德荣教授的分布式数据库系统讲义涵盖了分布式数据库设计、事务管理、查询优化、并发控制、恢复策略等多个核心主题,对于理解和实践分布式数据库系统有着重要的指导价值。

    东北大学分布式数据库课件和真题

    分布式数据库是计算机科学中的一个重要领域,它涉及到如何在多个计算机节点上存储和管理大量数据,以实现高可用性、可扩展性和性能优化。东北大学的这门课程显然旨在教授学生如何设计、实施和管理这样的系统。提供的...

    东北大学2009年春季博士入学试题-分布式数据库

    分布式事务是指在分布式数据库中,多个节点之间的统一事务处理。在分布式事务中,需要使用分布式事务实现模型,例如 2PC(两阶段提交)协议,以确保事务的一致性和可靠性。在 2PC 协议中,如果参与者未收到 C/A 报文...

    分布式数据库系统及其应用与答案

    分布式数据库系统是现代大型数据处理的关键技术之一,它在应对海量数据存储、高并发访问以及地理分布的数据需求方面发挥着重要作用。《分布式数据库系统及其应用(第二版)》由邵佩英编著,是中国科大出版社出版的...

    分布式数据库架构及企业实践-基于Mycat中间件.pdf

    《分布式数据库架构及企业实践——基于Mycat中间件》对 Mycat 从入门到进阶、从高级技术实践到架构剖析、从网络通信协议解析到系统工作原理的方方面面进行了详细讲解,并剖析了 Mycat的 SQL 路由、跨库联合查询、...

    关于2PC协议对分布式数据库的事务恢复机制.pdf

    分布式数据库事务恢复机制中二阶段提交协议(2PC)对分布式数据库的事务恢复机制的研究 摘要: 本文主要研究了分布式数据库系统中的事务恢复机制,特别是二阶段提交协议(2PC)在分布式数据库的事务恢复机制中的...

    分布式数据库2019考题.rar

    3. **分布式事务处理**:ACID(原子性、一致性、隔离性、持久性)是分布式数据库事务处理的基本原则。在分布式环境下,如何保证事务的正确执行是一项挑战,例如两阶段提交(2PC)、三阶段提交(3PC)等协议就是为了...

    清华大学 分布式数据库课件

    分布式数据库是现代信息技术领域中的重要概念,尤其在大数据处理、云计算和互联网应用中扮演着核心角色。清华大学作为中国顶级的高等教育机构,在计算机科学和技术的教学方面有着深厚的底蕴。这份"清华大学分布式...

    分布式数据库架构及企业实践-基于Mycat中间件

    《分布式数据库架构及企业实践——基于Mycat中间件》对 Mycat 从入门到进阶、从高级技术实践到架构剖析、从网络通信协议解析到系统工作原理的方方面面进行了详细讲解,并剖析了 Mycat的 SQL 路由、跨库联合查询、...

    分布式数据库 第三章 分布式数据库的设计

    一个良好的分布式数据库设计可以提高系统的整体性能,减少网络传输量,提高数据的可用性和查询效率,增强局部事务效率和系统的可靠性。 设计策略 分布式数据库设计有两种主要的设计策略:Top-down 设计策略和 ...

    分布式数据库习题.doc

    分布式数据库系统是一种高级的数据库架构,它将数据分布在多个地理位置分散的计算机节点上,通过网络进行协同工作。这种系统的设计旨在提升数据的可用性、可靠性和性能,同时保持数据的一致性和完整性。以下是对...

    中国数据库行业研究:分布式数据库技术系列简报-金融级需求与分布式数据库应用契合.pdf

    1. 分布式数据库的设计原则:包括数据分片、副本控制、一致性协议、事务处理机制等。 2. 具体分布式数据库产品的比较:研究不同厂商和不同类型的分布式数据库产品的功能、性能、安全性等特性,以及它们在金融业务中...

Global site tag (gtag.js) - Google Analytics