乐趣区

关于后端:大白话聊分布式事务

致力不是为了和他人一较高下,而是为了让生存多一种可能,给将来多一份惊喜。

什么是分布式事务

简略的来说就是,一个大的操作由两个或者更多的小的操作共同完成。而这些小的操作又散布在不同的网络主机上。这些操作,要么全副胜利执行,要么全副不执行。

拿转账的例子来说下什么是分布式事务。张三和李四在不同的城市,存储他们账户信息的服务器也在不同的网络主机上。张三有 30 元钱,李四有 30 元钱。张三给李四转账 5 元就是一个事务。

实现这个事务,须要两个操作。首先得从张三账户上扣 5 元,而后再给李四账户上加 5 元。事务执行结束后,必须是两个操作都执行胜利,要么都失败。

事务的个性

分布式事务自身就是事务,所以也有事务的个性。事务有四个特色 ACID:

原子性(Atomicity):事务中的各个操作单元要么全副做,要么就全副不做。不能事务执行后,处于只做一半的状态。

一致性(Consistency):事务执行后,必须由一个统一状态变为另外一个统一状态。

隔离性(Isolation):事务之间不能互相烦扰。

持久性(Durability):一旦事务实现,对于数据的变更是永恒的。

上面咱们就以下面转账的例子来说下实现分布式事务的几种形式。

两阶段提交

两阶段提交的大略流程:

第一阶段 :失常状况下的操作过程如下:

在第一阶段,次要是事务管理者(经理)发动事务,让各个事务资源方(职员甲乙)确认资源是否满足,并做预处理(解冻)。资源方的操作有可能失败也可能胜利。如,张三账户有余 5 元钱,没方法解冻,就是失败。资源方把操作后果反馈给事务管理者。
异常情况下的操作过程如下:

如果预提交过程中呈现任何问题,导致事务不能执行。将会告诉资源方进行撤销预提交操作。

第二阶段:如果是职员甲和职员乙都通知经理,操作胜利了。

失常状况下的操作过程如下:

这个时候,张三账户上的金额是 25 元。李四账户上的金额是 35 元。

异常情况下的操作过程如下:

这个时候,张三账户上的金额是 30 元。李四账户上的金额也是 30 元。

总而言之,事务的执行会分为预提交和提交两步进行。任何一个小操作出问题,导致事务不能实现,将会进行回滚操作。

两阶段提交须要留神的:

1:两阶段提交,要有一个事务管理者协调各方的操作。各方对资源的占用要到整个事务完结后能力开释。这样会影响事务的效率。当并发量大的时候,零碎的性能会重大下滑。

2:事务管理者和资源方存在通信。有可能存在通信不通顺。如,职员甲承受到扣钱的命令后,职员甲扣完了钱。因为电话故障等起因,导致没方法告诉经理曾经操作胜利。因而,各方还要解决通信超时问题。

3:整个流程须要事务管理者协调各个资源方进行操作。然而,事务管理者可能呈现问题。导致没方法进行协调。如,经理生病了。

4:留神幂等性问题。可能存在对资源方反复调用的状况。这种状况下,资源方被调用屡次和调用一次的成果要一样。如上例中,经理第二次告诉职员甲扣 5 元的时候,职员甲要像上次一样,通知经理扣款曾经实现。然而,职员甲不能再进行扣款的动作。

基于音讯实现

基于音讯的实现大略过程如下:

基于音讯的分布式事务实现中,引入了消息中间件(助理),负责音讯的传递和事务执行状态的询问。这样就升高了零碎间的耦合度。

为什么职员甲在进行扣款前,要通知助理?

次要是怕本人扣款胜利了,又遗记通知助理。这个时候,助理也就没方法告诉职员乙操作了。通知助理后,如果职员甲遗记了,助理能够询问职员甲,是否执行胜利。进而决定是否该告诉职员乙进行加钱操作。

如果职员甲扣款失败,则应该告诉助理。助理在这种状况下,就不应再告诉职员乙加钱。

基于音讯实现的问题:基于音讯的分布式事务实现,考究的是最终一致性。也即所有的本地事务执行结束后,整个状态的统一。整个事务个别不会有回滚操作。如,当职员乙操作失败的时候,职员应该是再次告诉职员乙重试。

退出移动版