文档章节

分布式事务的思考

Mr_Qi
 Mr_Qi
发布于 08/17 18:32
字数 1448
阅读 49
收藏 1

背景

随着系统拆的越来越多,目前系统间的调用是越来越多。那么如何保证系统的一致性成了难点

思考

目前常规关于多系统事务来说会考虑分布式事务XA事务

目前XA事务支持的不是特别多 比如EJB容器会支持【jboss】但是对于传统tomcat等容器来说其实不具备原生XA事务能力。

从业界来看使用atomikos来实现分布式XA事务

Atomikos 是一个为Java平台提供增值服务的并且开源类事务管理器。

Atomikos TransactionsEssentials 是一个为Java平台提供增值服务的并且开源类事务管理器,以下是包括在这个开源版本中的一些功能:

l 全面崩溃 / 重启恢复

l 兼容标准的SUN公司JTA API

l 嵌套事务

l 为XA和非XA提供内置的JDBC适配器

那么我们来看下常规意义上分布式事务的实现

2PC

2PC(tow phase commit)两阶段提交 顾名思义它分成两个阶段,先由一方进行提议(propose)并收集其他节点的反馈(vote),再根据反馈决定提交(commit)或中止(abort)事务。我们将提议的节点称为协调者(coordinator),其他参与决议节点称为参与者(participants, 或cohorts):

当协调者接收到所有的参与者的反馈之后,开始进入事务提交阶段。如果所有参与者都返回 YES,那就发送 COMMIT 请求,如果有一个人返回 NO,那就返送 rollback 请求。

准备阶段

1)协调者节点向所有参与者节点询问是否可以执行提交操作 (vote),并开始等待各参与者节点的响应。

2)参与者节点执行询问发起为止的所有事务操作,并将 Undo 信息和 Redo 信息写入日志。(注意:若成功这里其实每个参与者已经执行了事务操作)

3)各参与者节点响应协调者节点发起的询问。如果参与者节点的事务操作实际执行成功,则它返回一个” 同意” 消息;如果参与者节点的事务操作实际执行失败,则它返回一个” 中止” 消息。

提交阶段

1)协调者节点向所有参与者节点发出”正式提交 (commit)” 的请求。

2)参与者节点正式完成操作,并释放在整个事务期间内占用的资源。

3)参与者节点向协调者节点发送” 完成” 消息。

4)协调者节点受到所有参与者节点反馈的” 完成” 消息后,完成事务。

 

协调者在询问阶段参与者将执行事务操作【也就是锁定资源】这种情况下对于协调者的稳定性提出了要求 如果出现挂机那么就容易出现一些不一致性

3PC

 

与两阶段提交不同的是,三阶段提交有两个改动点。

1、引入超时机制。同时在协调者和参与者中都引入超时机制。
2、在第一阶段和第二阶段中插入一个准备阶段。保证了在最后提交阶段之前各参与节点的状态是一致的。

也就是说,除了引入超时机制之外,3PC 把 2PC 的准备阶段再次一分为二,这样三阶段提交就有CanCommit【prepare】、PreCommit、DoCommit三个阶段。

TCC

和上述两个在db层次的协议不同 

上述两种方案对于db资源来说将会出现一些问题 整个事务的持续时间取决于最长的事务。如果某个事务时间太长 那么导致资源被锁定时间太长。这样的话将严重影响系统的吞吐率。

在一个长事务( long-running )中 ,一个由两台服务器一起参与的事务,服务器 A 发起事务,服务器 B 参与事务,B 的事务需要人工参与,所以处理时间可能很长。如果按照 ACID 的原则,要保持事务的隔离性、一致性,服务器 A 中发起的事务中使用到的事务资源将会被锁定,不允许其他应用访问到事务过程中的中间结果,直到整个事务被提交或者回滚。这就造成事务 A 中的资源被长时间锁定,系统的可用性将不可接受。

这个角度来看对于系统的编码压力大了许多 要求所有的参与者关于分布事务的实现完成TCC三个接口 同时保证幂等。因此通常来说使用较少

补偿

补偿相对于tcc机制来说减少了许多工作量。一般对于接口定义一个反向冲正操作

通常在分布式环境中定义多个接口方便进行反向冲正

事务消息

通过异步的形式将对应的消息发送【要求被调用方的处理结果不影响调用方的结果】

同时为了完成支持重复调用 必须被调用接口支持幂等性要求

对于目前来说除了写到db中还存在其他方案【典型就是事务消息】

© 著作权归作者所有

共有 人打赏支持
Mr_Qi

Mr_Qi

粉丝 280
博文 359
码字总数 369228
作品 0
南京
程序员
私信 提问
加载中

评论(2)

Mr_Qi
Mr_Qi

引用来自“金贞花”的评论

一切都在支付宝PPT的 第一张图里面
对的~就是参考的这个~技术普惠啊~
金贞花
金贞花
一切都在支付宝PPT的 第一张图里面
rocketmq事务消息入门介绍

说明 周五的时候发了篇:Rocketmq4.3支持事务啦!!!,趁着周末的时候把相关内容看了下,下面的主要内容就是关于RocketMQ事务相关内容介绍了。 说明: 今天这篇仅仅是入门介绍,并没有涉及到...

匠心零度
10/29
0
0
PHP分布式事务的探究

我是一个PHPer,最近在学习微服务的相关知识,在学习过程中发现微服务的一大难点:分布式事务问题,尽然没什么解决方案!!!微服务的实现到是不少!可是..... 在日常思考中我画了个如下的自己实现多...

1514582970
07/02
574
3
从一笔金币充值去思考分布式事务

文章纲要 ● 此次分享的缘由 ● 目前分布式事务问题是怎么解决的 ● 行业中有什么解决方案 ● 这些解决方案分别有什么优缺点 ● 别人是怎么做的 ● 我们可以怎么来做 此次分享的缘由 支付重构...

Mr_zebra
11/19
0
0
从银行转账失败到分布式事务:总结与思考

原文出处:xybaby 思考这个问题的初衷,是有一次给朋友转账,结果我的钱被扣了,朋友没收到钱。而我之前一直认为银行转账一定是由事务保证强一致性的,于是学习、总结了一下分布式事务的各种...

xybaby
2017/10/24
0
0
【Spring 事务管理系列之一】Spring使用JDBC的事务管理例子

本打算系列之一把这次写的大纲列出来呢,无奈自己没想好,只有大致定一个方向,待后面补充,或者重新组织这一系列。 做几个概念的澄清和一些基础东西的介绍 1、假设你熟悉JDBC提供的api操作,...

敲代码猥琐男
2015/01/10
2.8K
1

没有更多内容

加载失败,请刷新页面

加载更多

[LintCode] Serialize and Deserialize Binary Tree(二叉树的序列化和反序列化)

描述 设计一个算法,并编写代码来序列化和反序列化二叉树。将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”。 如何反序列化或序列化二叉树是没有限制的,你...

honeymose
今天
5
0
java框架学习日志-7(静态代理和JDK代理)

静态代理 我们平时去餐厅吃饭,不是直接告诉厨师做什么菜的,而是先告诉服务员点什么菜,然后由服务员传到给厨师,相当于服务员是厨师的代理,我们通过代理让厨师炒菜,这就是代理模式。代理...

白话
今天
23
0
Flink Window

1.Flink窗口 Window Assigner分配器。 窗口可以是时间驱动的(Time Window,例如:每30秒钟),也可以是数据驱动的(Count Window,例如:每一百个元素)。 一种经典的窗口分类可以分成: 翻...

满小茂
今天
18
0
my.ini

1

architect刘源源
今天
16
0
docker dns

There is a opensource application that solves this issue, it's called DNS Proxy Server It's a DNS server that solves containers hostnames, if could not found a hostname that mat......

kut
今天
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部