分布式事务概论

一、事务的概念

  事务是一组操作的执行单元,相对于数据库操作来讲,事务管理的是一组SQL指令,比如增加,修改,删除等,事务的一致性,要求,这个事务内的操作必须全部执行成功,如果在此过程种出现了差错,比如有一条SQL语句没有执行成功,那么这一组操作都将全部回滚

  最经典的例子便是:A向B汇款500元,B账户多了500元,这整个过程,要么全部正常执行,要么全部回滚,不然就会出现A扣款,B收不到钱,或者A没扣款,B收到500元的情况,这种场景是灾难性的。

严格意义上的事务实现应该是具备原子性、一致性、隔离性和持久性,简称 ACID。

  • 原子性(Atomicity),可以理解为一个事务内的所有操作要么都执行,要么都不执行。
  • 一致性(Consistency),可以理解为数据是满足完整性约束的,也就是不会存在中间状态的数据,比如你账上有400,我账上有100,你给我打200块,此时你账上的钱应该是200,我账上的钱应该是300,不会存在我账上钱加了,你账上钱没扣的中间状态
  • 隔离性(Isolation),指的是多个事务并发执行的时候不会互相干扰,即一个事务内部的数据对于其他事务来说是隔离的。
  • 持久性(Durability),指的是一个事务完成了之后数据就被永远保存下来,之后的其他操作或故障都不会对事务的结果产生影响。

而通俗意义上事务就是为了使得一些更新操作要么都成功,要么都失败。

 

二、本地事务和分布式事务

  本地事务:本地事务是在同一个JVM实例中调用不同的资源形成事务,紧密依赖于底层资源管理器(例如数据库连接 ),事务处理局限在当前事务资源内。此种事务处理方式不存在对其他应用服务器或实例的依赖。

  如上述说到的汇款案例来说,若两个过程都在同一个JVM实例中,使用同个数据库连接,则事务比较好控制,如下图:

  

  分布式事务:分布式事务是在一个JVM实例中调用不同的服务形成事务,不同的服务可能不在同一个JVM实例中,可能涉及到操作多个数据库的事务,必须保证每个独立节点上的数据操作可以满足ACID。

  如上述说到的汇款案例来说,若两个过程在不同的JVM实例中,使用不同的数据库连接,则事务不好控制,原因是A,B无法知道事务在其他地方所做的所有动作,无法实现事务的一致性,如下图,A,B各自使用自己的事务管理完成begin,commit,rollback等操作,AB整个过程是无法实现事务一致性的。

  

分布式事务顾名思义就是要在分布式系统中实现事务,它其实是由多个本地事务组合而成。

对于分布式事务而言几乎满足不了 ACID,其实对于单机事务而言大部分情况下也没有满足 ACID,不然怎么会有四种隔离级别呢?所以更别说分布在不同数据库或者不同应用上的分布式事务了。

三,分布式事务解决方案

1,强一致性事务演变:2PC 和 3PC, TCC

 2PC 和 3PC 是一种强一致性事务,不过还是有数据不一致,阻塞等风险,而且只能用在数据库层面。

而 TCC 是一种补偿性事务思想,适用的范围更广,在业务层面实现,因此对业务的侵入性较大,每一个操作都需要实现对应的三个方法。

2,由于中间件等服务广泛应用,对一些实时性要求不高的业务场景,实现最终一致性成为了越来越流行的分布式事务解决方案,

实现有:本地消息、事务消息和最大努力通知其实都是最终一致性事务,因此适用于一些对时间不敏感的业务。

下面就对这两种事务实现进行讲解!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值