大白话聊聊分布式事务

什么是分布式事务

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

拿转账的例子来说下什么是分布式事务。张三和李四在不同的城市,存储他们账户信息的服务器也在不同的网络主机上。张三有30元钱,李四有30元钱。张三给李四转账5元就是一个事务。完成这个事务,需要两个操作。首先得从张三账户上扣5元,然后再给李四账户上加5元。事务执行完毕后,必须是两个操作都执行成功,要么都失败。

事务的特性

分布式事务本身就是事务,所以也有事务的特性。事务有四个特征ACID: A:原子性(Atomicity) 事务中的各个操作单元要么全部做,要么就全部不做。不能事务执行后,处于只做一半的状态。 C:一致性(Consistency) 事务执行后,必须由一个一致状态变为另外一个一致状态。 I:隔离性(Isolation) 事务之间不能相互干扰。 D:持久性(Durability) 一旦事务完成,对于数据的变更是永久的。

分布式事务实现方式

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

两阶段提交

两阶段提交的大概流程:

第一阶段: 正常情况下的操作过程如下:

在第一阶段,主要是事务管理者(经理)发起事务,让各个事务资源方(职员甲乙)确认资源是否满足,并做预处理(冻结)。资源方的操作有可能失败也可能成功。如,张三账户不足5元钱,没办法冻结,就是失败。资源方把操作结果反馈给事务管理者。

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

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

第二阶段: 如果是职员甲和职员乙都告诉经理,操作成功了。 正常情况下的操作过程如下:

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

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

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

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

两阶段提交需要注意的

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

事务管理者和资源方存在通信。有可能存在通信不通畅。如,职员甲接受到扣钱的命令后,职员甲扣完了钱。由于电话故障等原因,导致没办法通知经理已经操作成功。因此,各方还要处理通信超时问题。

整个流程需要事务管理者协调各个资源方进行操作。但是,事务管理者可能出现问题。导致没办法进行协调。如,经理生病了。

注意幂等性问题。可能存在对资源方重复调用的情况。这种情况下,资源方被调用多次和调用一次的效果要一样。如上例中,经理第二次通知职员甲扣5元的时候,职员甲要像上次一样,告诉经理扣款已经完成。但是,职员甲不能再进行扣款的动作。

基于消息实现

基于消息的实现大概过程如下:

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

为什么职员甲在进行扣款前,要告诉助理?主要是怕自己扣款成功了,又忘记告诉助理。这个时候,助理也就没办法通知职员乙操作了。告诉助理后,如果职员甲忘记了,助理可以询问职员甲,是否执行成功。进而决定是否该通知职员乙进行加钱操作。

如果职员甲扣款失败,则应该通知助理。助理在这种情况下,就不英再通知职员乙加钱。

基于消息实现的问题

基于消息的分布式事务实现,讲究的是最终一致性。也即所有的本地事务执行完毕后,整个状态的一致。

整个事务一般不会有回滚操作。如,当职员乙操作失败的时候,职员应该是再次通知职员乙重试。

原文发布于微信公众号 - 我为Net狂(dotNetCrazy)

原文发表时间:2017-03-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏韩伟的专栏

高性能服务器架构思路:缓冲清理策略(二)

虽然使用缓存思想似乎是一个很简单的事情,但是缓存机制却有一个核心的难点,就是——缓存清理。我们所说的缓存,都是保存一些数据,但是这些数据往往是会变化的,我们要针...

9.4K0
来自专栏hotqin888的专栏

工程师对电子规范、图集和计算书的管理-EngineerCMS

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hotqin888/article/det...

1002
来自专栏小程序解决方案的专栏

3 元购买 Wafer1 指南

进入微信公众平台,点击右上角的【立即注册】,按照流程注册小程序账号。

1K0
来自专栏Youngxj

利用手机扫描二维码远程将电脑关机工具

3145
来自专栏CDA数据分析师

Python部署手记:django, gunicorn, virtualenv, circus, nginx

手记,以免下次配置再入坑。有些细节未做详细描述,如果有问题,可以评论或私信我。 初次尝试搭python服务器,强撸python3,花样作死。过程中出现各种错误,...

3907
来自专栏ImportSource

Gitlab.com误删数据最近动态:恢复60%

GitLab.com 官方网站发布声明称由于其产品数据库问题导致的网站无法正常访问。据国外媒体报道称 Gitlab 网站疲惫的系统管理员深夜在进行数据库维护时,...

3319
来自专栏杨建荣的学习笔记

记一次远程协助的排错案例(r9笔记第62天)

前几天的时候帮助一个网友看了他遇到的一个问题,在问题处理中也让我有不少的感悟。 最开始的时候这位网友的问题是一个10gR2的单实例数据库,监听无法正常关闭和启动...

3815
来自专栏Youngxj

emlog插入优酷视频插件分享

2893
来自专栏Jerry的SAP技术分享

Eclipse被卡死了或者失去响应了后分析根源的一个小技巧

大家在使用Eclipse的过程中可能会偶尔遇到该IDE失去响应或者一直停留在某个步骤迟迟结束不了的情况。没有经验的朋友可能会用任务管理器强制结束Eclipse进...

1214
来自专栏ThoughtWorks

TW洞见〡Ruby Web服务器:这十五年

文章作者来自:ThoughtWorks - 韩翼。 坦率的说,作为一门年轻的计算机语言,Ruby在最近二十年里的发展并不算慢。但如果与坐拥豪门的明星语言们相比,...

30510

扫码关注云+社区

领取腾讯云代金券