分布式事务

Posted kyleinjava

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分布式事务相关的知识,希望对你有一定的参考价值。

一、什么是事务?事务的特性

  1.事务的单个逻辑单元执行一系列操作要么全部成功要么全部失败。

  2.事务有四个特性,分别是ACID。

    Atomic:原子性      事务中的各项操作要么全部做,要么全部不做,任何一项操作的失败都会导致整个事务的失败。

    Consistent:一致性     事务结束后系统状态是一致的。

    Isolate:隔离性      并发执行的事务彼此无法看到对方的中间状态。

    Durable:持久性       事务完成后所做的改动都会被持久化,即使发生灾难性的失败,通过日志和同步备份可以在故障发生后重建数据。

  

二、当事务并发时,出现的问题 

  1.第一类更新丢失:A事务撤销时,把B事务已经提交更新的数据给覆盖了。

  2.脏读:A事务读取到了B事务还没有提交更新的数据。

  3.不可重复读:事务A读取到了事务B提交的更新(update和delete)数据。(如果要避免不可重复读就要锁行)

  4.幻读:事务A读取到了事务B新插入(insert)的数据。(如果要避免幻读就要锁表)

  5.第二类更新丢失:A事务提交更新的数据,将B事务提交更新的数据覆盖了。

 

三、事务的隔离级别

      事务的隔离级别越高,并发性越差

      技术分享图片

 

四、什么是分布式事务?

  分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。由于业务的过于庞大,很多系统都被拆成多个服务和数据库。如果一个操作需要多个服务和数据库来共同执行,但是单个的事务只能作用于一个数据库,这样就需要应用分布式事务来保证数据的一致性。常见的例子就是

 

五、现行的分布式事务方案。

  1.基于XA协议的两阶段提交方案

    所谓的两段式提交方案就是将整个分布式事务分为两个阶段,第一阶段是表决阶段,所有参与者都将本事务能否成功的信息反馈发给协调者;第二阶段是执行阶段,协调者根据所有参与者的反馈,通知所有参与者,步调一致地在所有分支上提交或者回滚。

  两阶段提交方案应用很广泛,但是性能不是很好,比较耗时间。XA是一个分布式协议,其大致分为两个部分,事务协调器和本地资源管理器。本地资源管理器是由数据库实现,而事务管理器作为全局的调度者,负责各个本地资源的提交和回滚。mysql对AX的支持不是很理想。

  技术分享图片

 

 

  2.TTC方案

    TTC方案是两段式提交的一种改进,在电商和金融领域应用的比较多。其将整个业务逻辑的每个分支显式的分成了Try、Confirm、Cancel三个操作。Try部分完成业务的准备工作,confirm部分完成业务的提交,cancel部分完成事务的回滚。

    事务开始时,业务应用会向事务协调器注册启动事务。之后业务应用会调用所有服务的try接口,完成一阶段准备。之后事务协调器会根据try接口返回情况,决定调用confirm接口或者cancel接口。如果接口调用失败,会进行重试。

    TTC对业务代码的入侵性比较强,且开发难度比较大。

    基本原理如下图所示。

    技术分享图片

 

 

  3.基于消息的最终一致性方案

    基于消息的最终一致性方案就是保证本地操作和发送消息在一个事务中,其他服务通过订阅消息来进行相应的数据库操作,以达到数据的最终一致性。

    技术分享图片

 

以上是关于分布式事务的主要内容,如果未能解决你的问题,请参考以下文章

86 SpringCloud解决分布式事务

MongoDB4.2分布式事务

分布式事务

分布式事务初探

分布式事务,高并发下分布式事务的解决方案

分布式事务就是由多个本地事务组合而成的事务