分布式事务相关问题

简介: 分布式事务没有标准答案,只有结合业务场景的解决方案TCC,XA,JTA,LCN,2PC1、分布式事务是什么    数据库分库分表之后,保证多个数据库之间的提交和回滚数据的一致性 ,如图,假设一个订单系统,订单数据库和调度数据库是分开的,如何保证订单库和调度库的一致性,就是所谓分布式事务,这里多说一句,单一数据库不存在分布式事务的问题。

分布式事务没有标准答案,只有结合业务场景的解决方案

TCC,XA,JTA,LCN,2PC

1、分布式事务是什么

    数据库分库分表之后,保证多个数据库之间的提交和回滚数据的一致性 ,如图,假设一个订单系统,订单数据库和调度数据库是分开的,如何保证订单库和调度库的一致性,就是所谓分布式事务,这里多说一句,单一数据库不存在分布式事务的问题。

img_c079aa1416b23266201d545ca51bc2a2.png

2、常用的分布式事务解决方案第一类:XA,JTA,TCC,2PC,这些都是基于两阶段提交的思想

    (1)、异步任务,校验数据,对比数据是否正确,通知工作人员,也可以根据代码进行修正是数据(最好实现的方法,但并不是分布式事务的解决方案)

    (2)、XA只是一个约定协议,不是一个实现,定义了一个协议,两阶段提交的一个协议2PC,实现是其他开源软件的事情(Java,PHP,go,数据库),JTA就是Java中实现分布式事务的一组规范

    x/openXA 包含了2PC规范 -> Java阵营根据XA协议,定义了JTA规范 -> Atomikos框架进行实现

    Java中常用Atomikos在实现,适用场景:一个Java应用实例,操作多个数据库,针对于单体应用,不能用于跨系统之间的协调,如图所示,还是外卖订单的图,如果通过JTA实现,那么就不能跨系统调用,只能是单一系统进行多个数据库的操作

img_ef0a6c3a231f89e00d8f9683665f49f6.png

    看一下代码中如何使用

img_2e5de39c544b1276a79e2ffbf420467d.png

    此处的数据库连接池,采用了阿里的druid连接池

img_50dfa14873d43adc193adeb61bf72c16.png

    事务管理交由atomikos进行管理,具体的代码其实百度查有很多例程,此处就不多说了,厂商封装好了atomikos,不仅仅是要求Java实现,还要求数据库支持才行(mysql,oracle,db2)(undo,redo日志),此处我们画一个图来说明一下atomikos的实现原理

第一阶段,准备阶段

img_2d4ecd8fd87a74fa2b07312a29e38e2f.png

第二阶段:提交阶段

img_f9b4633479e41aaf5b3a37488b162722.png

    优点:数据一致性好

    缺点:性能比较低,需要保证两个数据库同时在连接数据库,占用很大的资源。一旦协调员挂掉了,无法进行恢复或者回滚。

    互联网项目用这种方法并不多,实在太消耗资源了,占用太多的数据库的链接资源,因为只能是单一系统的应用,限制性很大,分布式事务,更多是应用之间的问题,对此,atomikos提出了一个TCC的解决方案,应用与应用之间的分布式事务

    TCC就是Atomikos发出的一篇论文(编程式的分布式事务,需要我们自己写代码来实现)

    Java应用提供这三个操作接口(通过http/rest方式提供):Try 尝试、Confirm 确认、Concel 取消

img_58e4b196c2b65e3ddc64ddaeb823b7e5.png

    每一个都是通过HTTP来实现的,并且中间并不是通过数据库进行回滚数据,而是根据自己的代码进行实现,只需要保证BASE原则就可以,保证最终一致性就可以进行,其实TCC就是一种两阶段提交思想的自己编码实现

    就好像是ACID原则那样,参考http://drupalchina.cn/node/1401这边文章

3、MQ(消息队列)

    消息队列实现分布式事务的思路: 

    (1)数据一定要投递到MQ(消息队列本身提供确认机制activemq\rabbitmq,rocketmq,kafka...)

    (2)消息消费的确认机制,消息一定要被正确消费(消息队列ack机制)

    (3)保障消费处理的幂等性,根据业务逻辑去实现(处理一条消息,就需要保留一条记录,单独一个记录表 )

img_805ab73fcfbea1990b7ec35c0ceea0a1.png

4、LCN

    开源框架,可以直接到GitHub中学习,目前应用公司不算多

相关实践学习
快速体验阿里云云消息队列RocketMQ版
本实验将带您快速体验使用云消息队列RocketMQ版Serverless系列实例进行获取接入点、创建Topic、创建订阅组、收发消息、查看消息轨迹和仪表盘。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
机器学习/深度学习 存储 人工智能
AI与量子计算:推动计算科学的边界
【10月更文挑战第7天】AI与量子计算的融合,标志着计算科学进入了一个全新的时代。在这个时代里,计算能力的边界被不断拓宽,科技创新的速度不断加快。我们有理由相信,在未来的日子里,AI与量子计算将继续携手并进,共同推动计算科学向着更加智能、更加高效的方向发展。让我们期待这一天的到来,共同见证计算科学的无限可能。
|
7月前
|
JSON API 开发者
京东商品列表 API 接口全攻略
京东商品列表API接口是京东开放平台提供的开发者工具,支持关键词搜索、店铺ID指定和商品分类筛选等查询方式,实时获取商品基础及拓展信息。接口数据丰富、查询灵活、更新及时且安全可靠,适用于电商数据分析、比价应用开发等场景。Python调用示例展示了如何安装必要库、构造请求参数及签名、发送请求并处理响应,确保开发者能高效利用该接口。
212 11
|
8月前
|
机器学习/深度学习 计算机视觉
YOLOv11改进策略【注意力机制篇】| 2024 PPA 并行补丁感知注意模块,提高小目标关注度
YOLOv11改进策略【注意力机制篇】| 2024 PPA 并行补丁感知注意模块,提高小目标关注度
293 11
YOLOv11改进策略【注意力机制篇】| 2024 PPA 并行补丁感知注意模块,提高小目标关注度
|
Python
Python计算误码率,输入是0-1比特流矩阵和小数矩阵
本文提供了一个Python函数calculate_ber,用于计算两个NumPy矩阵表示的二进制信号和接收信号之间的误码率(BER),其中包括信号与接收信号的比较、误差计数以及BER的计算过程,并给出了具体的使用示例。
239 2
|
11月前
|
安全 持续交付 云计算
揭秘云计算中的容器化技术及其优势
揭秘云计算中的容器化技术及其优势
522 1
|
11月前
|
JSON API 数据库
电商拍立淘按图搜索API接口,数据格式示例
电商拍立淘按图搜索API接口系列为电商平台和购物应用提供了强大的图像搜索功能,以下是其文档说明的详细参考
|
监控 安全 物联网
智能家居系统的安全与隐私保护技术
随着物联网技术的飞速发展,智能家居系统逐渐进入千家万户。然而,随之而来的安全与隐私问题亦日益凸显。本文将探讨智能家居系统中存在的安全风险,分析当前采用的主要安全技术措施,并指出用户在享受智能生活时需注意的隐私保护策略。通过深入浅出的方式,旨在增强大众对智能家居安全的认识,并提供实用的保护建议。
|
安全 测试技术 网络安全
|
机器学习/深度学习 传感器 自然语言处理
时间序列预测的零样本学习是未来还是炒作:TimeGPT和TiDE的综合比较
最近时间序列预测预测领域的最新进展受到了各个领域(包括文本、图像和语音)成功开发基础模型的影响,例如文本(如ChatGPT)、文本到图像(如Midjourney)和文本到语音(如Eleven Labs)。这些模型的广泛采用导致了像TimeGPT[1]这样的模型的出现,这些模型利用了类似于它们在文本、图像和语音方面获得成功的方法和架构。
308 1
|
机器学习/深度学习 人工智能 算法
详细的人工智能学习路线和资料推荐
详细的人工智能学习路线和资料推荐
1272 1