分布式事务- 二阶段协议

一、前言

在单个数据库实例时候,我们可以在一个数据源的事务(本地事务)内做多步数据库操作,在事务内的多个操作要么全部执行生效,要么全部不生效。在多数据实例节点时候,我们对多个实例的数据源进行操作时候就没办法把多个操作放到一个大的事务内来管理了,因为多个实例操作的是不同的数据源,而数据库自带的事务是针对单个数据源来说的。

二、二阶段协议

单个数据库实例内的事务我们称为本地事务,需要保证多个数据源的操作要么都做要么都不做的事务我们成为分布式事务,为了实现分布式事务,二阶段与三阶段协议就应运而生了。

分布式事务由事务发起者、资源管理器(参与者)、事务协调者组成,下面我们看看二阶段协议内容:

  • 第一阶段 分布式事务发起方向事务协调器发起分布式事务,协调器则向所有事务参与者发起准备请求,事务参与者接受到请求后执行本地事务,但是不提交。如果所有事务参与者都返回了准备OK到事务协调器

则事务协调器准备进入第二阶段。如果有一个参与者返回准备失败,则事务协调器向所有参与者发起事务回滚请求,事务参与者收到请求后回滚执行的本地事务,则分布式事务结束。

image.png

  • 第二阶段 事务协调器向所有事务参与者发起提交事务的请求,事务参与者接受到请求后,执行本地事务的提交操作。如果事务协调器收到所有参与者提交OK则分布式事务结束。

image.png

如果协调器发现有些参与者返回事务提交失败,则执行具体的事务补偿策略。

三、总结

二阶段协议是个标准协议,协议只是规定了分布式事务实现的骨架,并没有规定具体如何实现,比如事务协调器是作为一个单独应用存在,还是与事务发起方一起部署的?事务参与者是单独的应用还是与发起方一起的?并且并没有考虑异常情况,比如第二阶段如果有部分参与者返回提交失败或者由于网络原因返回了提交OK,但是事务协调器没有收到,该怎么处理?

另外分布式事务并不是简单说对多个数据源操作的原子性,还可以是数据源操作与远程RPC的原子性,数据源与发送消息的原子性。

下文我们来谈谈2阶段的缺点以及三阶段协议的原理。

最后

想了解JDK NIO和更多Netty基础的可以单击我

想了解更多关于粘包半包问题单击我 更多关于分布式系统中服务降级策略的知识可以单击 单击我 想系统学dubbo的单击我 想学并发的童鞋可以 单击我

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java技术栈

分布式Session共享解决方案

Session是服务器用来保存用户操作的一系列会话信息,由Web容器进行管理。单机情况下,不存在Session共享的情况,分布式情况下,如果不进行Session...

3766
来自专栏程序员互动联盟

浏览器开发系列第四篇:windows下如何调试最新chromium源码

接二连三的事情,时间比较紧张,但是还是没有把这个系列的文章丢掉,因为这也是对自己知识的总结吧。提倡大家多写写,以后再看的时候会有种莫名的小激动。 上周写的是ch...

4008
来自专栏分享达人秀

开发IDE大升级,终于迎来了Android Studio

通过前面几期的学习,我们知道了Android的前世今生,也了解了Android的系统架构和应用组件,也连续用了几期来学习Android开发环境的搭建,不...

25510
来自专栏nimomeng的自我进阶

简单免费的文档中心——dokuWiki搭建指南

首先去官网下载页面下载最新版本的Dokuwiki,根据自己需要动态打包,不需要安装:

6.7K4
来自专栏北京马哥教育

【图文并茂】一步步带你了解Web站点架构

1.1 http反向代理服务器 在web站点前端,我们需要搭建一个反向代理服务器,用于负责接受用户的请求,请求包括动态和静态的内容请求。一般反向代理服务器的部署...

4908
来自专栏HappenLee的技术杂谈

流处理与消息队列------《Designing Data-Intensive Applications》读书笔记16

在流处理之中,当输入是文件时,第一个处理步骤通常是将其解析为一连串的记录。在流处理之中,记录通常被称为事件,每个事件都是一个小的、独立的、不可变的对象,通常每个...

1293
来自专栏微服务生态

缓存穿透、缓存并发、缓存失效之思路变迁

我们在用缓存的时候,不管是Redis或者Memcached,基本上会通用遇到以下三个问题:

1484
来自专栏java思维导图

Cookie、Session、Token那点事儿

前言:新公司项目中使用到了Cookie,在各大Android技术讨论群向前辈们取经讨论这cookie、session、token这仨哥们的时候,很多开发者说法不...

3793
来自专栏腾讯移动品质中心TMQ的专栏

手机管家PiTest插件辅助测试方法分享

背景 你是否遇到过这样的测试场景: 垃圾需要达到2G! Wifi必要有有风险! CPU占用率达到70%以上! 日流量使用占用套餐的一半! 你的QQ必须要有风险...

2096
来自专栏云计算教程系列

如何在Ubuntu 14.04上设置Shiny Server

Shiny是一个R包,允许用户将R代码转换为交互式网页。Shiny server是RStudio提供的服务器,可用于托管和管理Web上的Shiny应用程序。除了...

2571

扫码关注云+社区

领取腾讯云代金券