博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
分布式事务的实现方式
阅读量:5894 次
发布时间:2019-06-19

本文共 980 字,大约阅读时间需要 3 分钟。

hot3.png

TCC

    参与角色

        业务活动管理器(协调者)、业务服务

    TCC解释        

        Try阶段:尝试执行,完成所有业务检查(一致性),预留必须业务资源(准隔离性)

        Confirm阶段:确认执行真正执行业务,不作任何业务检查,只使用Try阶段预留的业务资源,Confirm操作满足幂等性。要求具备幂等设计,Confirm失败后需要进行重试。

        Cancel阶段:取消执行,释放Try阶段预留的业务资源 Cancel操作满足幂等性Cancel阶段的异常和Confirm阶段异常处理方案基本上一致。

    实现

        PS:所有业务需要实现TCC接口;通过补偿可以实现最终一致性。

        ab8e9cd744a2cefb6b9e28a88b8a4956492.jpg

    实例

    举个简单的例子如果你用100元买了一瓶水, Try阶段:你需要向你的钱包检查是否够100元并锁住这100元,水也是一样的。如果有一个失败,则进行cancel(释放这100元和这一瓶水),如果cancel失败不论什么失败都进行重试cancel,所以需要保持幂等。如果都成功,则进行confirm,确认这100元扣,和这一瓶水被卖,如果confirm失败无论什么失败则重试(会依靠活动日志进行重试)

数据库分布式事务中的 XA Transactions

    角色

        事务管理器(协调者)、业务服务

    实现

        第一阶段:事务管理器要求每个涉及到事务的数据库预提交(precommit)此操作,并反映是否可以提交.

        第二阶段:事务协调器要求每个数据库提交数据,或者回滚数据。

       PS: XA协议基于2pc协议实现。

MQ

    角色

        消息中间件、业务服务

    实现 

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

       执行本地事务。

        第二阶段确认消息发送,如果确认消息失败,在RocketMq Broker中提供了定时扫描没有更新状态的消息,如果有消息没有得到确认,会向消息发送者发送消息,来判断是否提交

        第三阶段中间件发送消息给其它业务服务。如果 发送超时,则需要一直发送。

        第四阶段其它业务服务处理完成之后,需要通过中间件反馈给发起者。如果处理失败,则需要人工处理(由人工决定是否回滚或者继续)。

SAGA

    角色

            协调器、业务服务

    实现

            由Saga事务协调器协调,如果正常结束那就正常完成,如果某个步骤失败,则根据相反顺序一次调用补偿操作

转载于:https://my.oschina.net/u/2312080/blog/2873947

你可能感兴趣的文章
树的总结--树的性质(树的深度) leetcode
查看>>
nagios短信报警(飞信fetion20080522004-linrh4)
查看>>
【Android游戏开发之六】在SurfaceView中添加组件!!!!并且相互交互数据!!!!...
查看>>
div加jquery实现iframe标签的功能
查看>>
linux 将大文件分成小文件
查看>>
CCNA- 距离矢量路由协议学习
查看>>
jira 配置 LDAP 访问
查看>>
Canonical发布Ubuntu server 11.10版本
查看>>
企业实践用户邮箱导入/导出(第2部分)
查看>>
我的友情链接
查看>>
【Java记录】try-with-resources的一个坑
查看>>
如何学习Linux命令-初级篇
查看>>
从Oracle Public Yum为Oracle Linux建立本地的Yum源
查看>>
Android开发——09Google I/O之让Android UI性能更高效(1)
查看>>
在 SELECT 查询中使用表表达式
查看>>
(二) php if语句,switch语句,continue语句,return语句,for 、while、do while 循环
查看>>
edx 获取当前request
查看>>
地址与引用
查看>>
静态路由和默认路由
查看>>
谈一谈Spring-Mybatis在多数据源配置上的坑
查看>>