文档章节

分布式事务

九分石人
 九分石人
发布于 07/11 17:35
字数 1172
阅读 35
收藏 0

行业解决方案、产品招募中!想赚钱就来传!>>>

分布式事务处理机制共有四种:

  1. 两阶段提交
  2. TCC事务(事务补偿)
  3. 本地消息表(异步确保),
  4. MQ事务消息。

两阶段提交:

与数据库XA事务一样,两阶段提交使用XA协议。

两阶段提交这种方案属于牺牲了一部分可用性来换取的一致性。

优点:尽量保证了数据的强一致,适合对数据强一致要求很高的关键领域。

缺点:实现复杂,牺牲了可用性,对性能影响较大,不适合高并发高性能场景,如分布式系统跨接口调用。

TCC事务:

TCC其实就是采用的补偿机制,其核心思想是:针对每个操作,都要注册一个与其对应的确认和补偿操作。分为三个阶段:

  1. Try阶段主要是对业务系统做检测和资源预留。
  2. Confirm阶段主要是对业务系统做确认提交,Try阶段执行成功并开始执行Confirm阶段时,默认Confirm阶段是不会出错的。即:只要Try成功,Confirm一定成功。
  3. Cancel阶段主要是在业务执行错误,需要回滚的状态下,执行的业务取消,预留资源释放。

优点:跟2阶段提交比起来,实现及流程相对简单了些,但数据的一致性也要比2阶段提交要差一些。

缺点:在2,3步中都可能失败。TCC是一种应用层的补偿方式,需要程序员在实现时写很多补偿的代码,一些场景中,一些业务流程用TCC不太好定义及处理。

本地消息表:

使用最多的,核心思想是将分布式事务拆分成本地事务进行处理,来源于ebay。

基本思路就是:

消息生产方,需要额外建一个消息表,并记录消息发送状态。消息表和业务数据要在一个事务里提交,也就是说他们要在一个数据库里面。然后会经由MQ发送到消息的消费方。如果消息发送失败,会进行重试发送。

消息消费方,需要处理这个消息,并完成这个的业务逻辑。如果此时本地事务处理成功,表明已经处理成功了,如果处理失败,那么就会重试执行。如果是业务上面的失败,可以给生产方发送一个业务补偿消息,通知生产方进行回滚等操作。

生产方和消费方定时扫描本地消息表,把还没处理完成的消息或者失败的消息在发送一遍。

这种方案遵循最终一致性。

优点:一种非常经典的实现, 避免的分布式事务,实现了最终一致性。

缺点:消息表会耦合到业务系统中,如果没有封装好的解决方案,会有很多杂活需要处理。

MQ事务消息:

有一些第三方的MQ是支持事务消息的,比如RocketMQ,他们支持事务消息的方式也是类似于采用的二阶段提交,但一些主流的MQ都是不支持事务消息的,如RabbitMQ和Kafka都不支持。

以阿里的RocketMQ为例:

第一阶段Prepared消息,会拿到消息的地址。

第二阶段执行本地事务,第三阶段通过第一阶段拿到的地址去访问消息,并修改状态。

也就是说在业务方法内部要想消息队列提交两次请求,一次发送消息和一次确认消息。如果确认消息发送失败了,RocketMQ会定期扫描消息集群中的事务消息,这是发现了Prepared消息,它会像消息发送者确认,所以生产方需要实现一个check接口,RocketMQ会根据发送端设置的策略来决定是回滚还是继续发送确认消息。这样就保证了消息发送与本地事务同时成功或同时失败。

优点:实现了最终一致性,不需要依赖本地数据库事务。

缺点:实现难度大,主流MQ不支持,RocketMQ事务消息部分代码未开源。

上一篇: 锁总结
下一篇: 分布式锁实现
九分石人
粉丝 0
博文 24
码字总数 36461
作品 0
杭州
程序员
私信 提问
加载中
请先登录后再评论。
工作流管理系统--Pegasus WMS

Pegasus (飞马座)工作流管理系统包括一套技术标准工作流程应用程序中执行帮助许多不同的环境中,包括桌面、校园集群、网格、云。它弥补了科学领域和执行环境通过自 动映射到分布式资源的高层工...

匿名
2013/02/24
5.2K
0
开源数据访问组件--Smark.Data

Smark.Data是基于Ado.net实现的数据访问组件,提供基于强类型的查询表达式进行灵活的数据查询,统计,修改和删除等操作;采用基于条件驱动的操作模式,使数据操作更简单轻松;内部通过标准SQL...

泥水佬
2013/03/12
2.5K
0
JBoss 事务服务--Narayana

JBoss 事务服务(JBossTS 也叫 Narayana )保护企业数据破坏,保证数据完整、准确。为基于Java的应用程序(包括那些写给JEE和EJB框架)从而消除风险和相关成本非常耗时的和解失败后。...

匿名
2012/11/04
1.3K
0
分布式处理系统--Apache Giraph

Apache Giraph 是一个可伸缩的分布式迭代图处理系统,灵感来自 BSP (bulk synchronous parallel) 和 Google 的 Pregel. Giraph 区别于其他项目的是开源、基于 Hadoop 的架构等。...

匿名
2013/05/08
2.6K
0
Lisp的STM库--STMX

STMX 是一个高性能的 Common Lisp 库,用于实现可组合的软件事务内存机制。 事务内存是一种并行程序设计的方式,其来自于数据库管理系统(DBMS)中的事务(Transaction)概念。事务内存目前有...

匿名
2013/05/09
812
0

没有更多内容

加载失败,请刷新页面

加载更多

如何在Android中以像素为单位获取屏幕尺寸 - How to get screen dimensions as pixels in Android

问题: I created some custom elements, and I want to programmatically place them to the upper right corner ( n pixels from the top edge and m pixels from the right edge). 我创建......

javail
今天
7
0
如何在不安装Microsoft Office的情况下用C#创建Excel(.XLS和.XLSX)文件?

问题: 如何在不使用运行代码的计算机上安装Excel的情况下使用C#创建Excel电子表格? 解决方案: 参考一: https://stackoom.com/question/dHZ/如何在不安装Microsoft-Office的情况下用C-创...

技术盛宴
今天
7
0
如何使用pip升级所有Python软件包? - How to upgrade all Python packages with pip?

问题: Is it possible to upgrade all Python packages at one time with pip ? 是否可以通过pip一次升级所有Python软件包? Note : that there is a feature request for this on the off......

法国红酒甜
今天
21
0
活体检测+合成图鉴别面前,人脸“照片活化”黑产攻击一秒被擒

本文作者:y****n 如今,随着人脸技术的日趋成熟,新兴娱乐文化得到了极大的推动,尤其是随着 DeepFake、FaceSwap 等人脸编辑及生成技术的发展,虚拟主播、人脸合成带给人们全新的体验,但同...

百度开发者中心
昨天
12
0
如何在SQL Server中将多行文本合并为单个文本字符串?

问题: Consider a database table holding names, with three rows: 考虑一个包含名称的数据库表,该表具有三行: PeterPaulMary Is there an easy way to turn this into a single str......

富含淀粉
今天
19
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部