分布式事务:
分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。简单的说,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败。本质上来说,分布式事务就是为了保证不同数据库的数据一致性。
产生的原因:
1.数据库分库分表
如果一个操作既访问01库,又访问02库,而且要保证数据的一致性,那么就要用到分布式事务。
2.应用SOA化
所谓的SOA化,就是业务的服务化。比如原来单机支撑了整个电商网站,现在对整个网站进行拆解,分离出了订单中心、用户中心、库存中心。对于订单中心,有专门的数据库存储订单信息,用户中心也有专门的数据库存储用户信息,库存中心也会有专门的数据库存储库存信息。这时候如果要同时对订单和库存进行操作,那么就会涉及到订单数据库和库存数据库,为了保证数据一致性,就需要用到分布式事务。
事务的ACID特性:
原子性(A)
所谓的原子性就是说,在整个事务中的所有操作,要么全部完成,要么全部不做,没有中间状态。对于事务在执行中发生错误,所有的操作都会被回滚,整个事务就像从没被执行过一样。
一致性(C)
事务的执行必须保证系统的一致性,就拿转账为例,A有500元,B有300元,如果在一个事务里A成功转给B50元,那么不管并发多少,不管发生什么,只要事务执行成功了,那么最后A账户一定是450元,B账户一定是350元。
隔离性(I)
所谓的隔离性就是说,事务与事务之间不会互相影响,一个事务的中间状态不会被其他事务感知。
持久性(D)
所谓的持久性,就是说一单事务完成了,那么事务对数据所做的变更就完全保存在了数据库中,即使发生停电,系统宕机也是如此。
常见的解决方案:
1.基于XA协议的两阶段提交
XA是一个分布式事务协议,由Tuxedo提出。XA中大致分为两部分:事务管理器和本地资源管理器。其中本地资源管理器往往由数据库实现,比如Oracle、DB2这些商业数据库都实现了XA接口,而事务管理器作为全局的调度者,负责各个本地资源的提交和回滚。XA实现分布式事务的原理如下:
总的来说,XA协议比较简单,而且一旦商业数据库实现了XA协议,使用分布式事务的成本也比较低。但是,XA也有致命的缺点,那就是性能不理想,特别是在交易下单链路,往往并发量很高,XA无法满足高并发场景。 两阶段提交涉及到多个节点的网络通信,通信时间如果过长,事务的相对时间也就会过长,那么锁定资源的时间也就长了.在高并发的服务中,就会存在严重的性能瓶劲。XA目前在商业数据库支持的比较理想,在mysql数据库中支持的不太理想,mysql的XA实现,没有记录prepare阶段日志,主备切换回导致主库与备库数据不一致。许多nosql也没有支持XA,这让XA的应用场景变得非常狭隘。
2.消息事务+最终一致性
所谓的消息事务就是基于消息中间件的两阶段提交,本质上是对消息中间件的一种特殊利用,它是将本地事务和发消息放在了一个分布式事务里,保证要么本地操作成功成功并且对外发消息成功,要么两者都失败,开源的RocketMQ就支持这一特性,具体原理如下:
1、A系统向消息中间件发送一条预备消息
2、消息中间件保存预备消息并返回成功
3、A执行本地事务
4、A发送提交消息给消息中间件
通过以上4步完成了一个消息事务。对于以上的4个步骤,每个步骤都可能产生错误,下面一一分析:
步骤一出错,则整个事务失败,不会执行A的本地操作
步骤二出错,则整个事务失败,不会执行A的本地操作
步骤三出错,这时候需要回滚预备消息,怎么回滚?答案是A系统实现一个消息中间件的回调接口,消息中间件会去不断执行回调接口,检查A事务执行是否执行成功,如果失败则回滚预备消息
步骤四出错,这时候A的本地事务是成功的,那么消息中间件要回滚A吗?答案是不需要,其实通过回调接口,消息中间件能够检查到A执行成功了,这时候其实不需要A发提交消息了,消息中间件可以自己对消息进行提交,从而完成整个消息事务
基于消息中间件的两阶段提交往往用在高并发场景下,将一个分布式事务拆成一个消息事务(A系统的本地操作+发消息)+B系统的本地操作,其中B系统的操作由消息驱动,只要消息事务成功,那么A操作一定成功,消息也一定发出来了,这时候B会收到消息去执行本地操作,如果本地操作失败,消息会重投,直到B操作成功,这样就变相地实现了A与B的分布式事务。原理如下:
虽然上面的方案能够完成A和B的操作,但是A和B并不是严格一致的,而是最终一致的,我们在这里牺牲了一致性,换来了性能的大幅度提升。当然,这种玩法也是有风险的,如果B一直执行不成功,那么一致性会被破坏,具体要不要玩,还是得看业务能够承担多少风险。
- 大小: 39.3 KB
- 大小: 63 KB
- 大小: 87.1 KB
- 大小: 29.2 KB
- 大小: 37.4 KB
分享到:
相关推荐
#资源达人分享计划#
本课程将深入探讨分布式事务管理框架Seata的核心概念和实际应用。学员将了解Seata在微服务架构中的作用、原理及实践,包括分布式事务、一致性、可靠性等方面的重要知识点。 视频大小:16.6G
分布式事务课程列表: 第01节--课程介绍 第02节--解决方案的效果演示 第03节--常用的分布式事务解决方案介绍 第04节--消息发送一致性方案探讨(可靠消息的前提保障) 第05节--JMS规范的消息发送与接收特点 第...
项目简介 提供基于spring-cloud系列整合的依赖jar包,比如分布式锁,接口文档,多数据源,单点登录,第三方集成等等可spring-boot配置的,简单化的使用工具。...提供mybatis与jpa多数据源配置,分布式事务。 daijie-
#资源达人分享计划#
复杂事件处理和分布式事务管理等方面[1]。Java平台以 其成熟的生态系统、跨平台的移植性、丰富的开源框架 和库以及稳定的性能,为分布式系统的开发提供了坚实 的基础[2]。深入探讨Java后端开发技术在分布式系统中 的...
西安电子科技大学研究生学位论文 本文系统介绍了江苏省高速公路收费系统设计及控制软件实现。探讨了当前流行的分布式计算模型以及分布式数据库的实现途径。有两种分布式数据库实现途径:(1)分布式事务:(2)复制。
分布式事务:涉及多个数据库时的事务管理。 案例研究:通过实际案例分析,展示事务在复杂查询中的应用。 适用人群 数据库管理员:需要深入理解MySQL事务管理以维护数据完整性。 后端开发者:在应用开发中需要执行...
《分布式数据库技术金融应用规范》的技术架构及分布式事务核心功能的解读揭秘 2019MySQL最新信息 H3C规模数据融合应用场景与技术探讨 Oracle数据库异构上云最佳实践 POLARDB产品架构与实现 阿里巴巴智能化运维探索 ...
在功能方面,该网上商城实现了商品展示、购物车管理、订单处理、用户注册登录等核心功能,并通过分布式事务管理、缓存技术等手段,优化了系统性能。此外,项目还考虑了安全性和可维护性,采用了多种安全策略和监控...
特别地,文章还深入探讨了ZAB协议中的事务处理方式、Leader和Follower的交互流程,以及在面对系统崩溃时的恢复策略。此外,文章还提供了Zookeeper源码中关于ZAB协议实现的细节分析,为理解分布式系统的底层逻辑提供...
该资料可能会探讨如何在J2EE框架内使用诸如EJB(Enterprise JavaBeans)、Servlets、JSP(JavaServer Pages)以及Web服务等组件来实现这些功能。此外,这份资料对于理解J2EE的安全性、事务管理、持久化机制等方面也...
就其安全问题展开论述,着重从数据库系统的体系结构,以及不安定因素出发,通过对安全策略和数据库的访问控制策略、以及分布事务性管理和故障恢复等方面进行深入探讨,从而为有效的预防、检测分布式数据库的安全提出...
同时,系统还引入了Redis缓存、分布式事务处理等高级特性,提升了系统的性能与稳定性。 此外,毕业论文详细记录了本博客系统的开发过程,从需求分析、系统设计到编码实现,都进行了深入的探讨与总结。通过阅读毕业...
本文探讨了一种面向 DaaS的 XML 数据库分布式封锁机制,在每个数据库节点上实现了一个基于模式树视图的细粒度语义锁,在全局节点上通过构建全局模式树视图来协调各节点的事务处理,最后比较了本文封锁机制与现有封锁...
同时,文档还探讨了分布式系统中的数据一致性问题,包括CAP定理、BASE理论等,并提出了相应的解决方案。此外,文档还提供了一些实用的工具和方法,帮助读者更好地理解和实践数据一致性。总的来说,这是一份理论与...
这样开发人员就不必关心一些底层技术,比如事务处理,安全等各个方面,而是把重点放在怎样实现业务逻辑上。但是我们应该注意,如果开发的应用不是分布式的情况下,那么采用EJB有可能大大降低系统的性能。因为,EJB...
JDBC 2.0可选包 简介 DataSource与JNDI 连接池 RowSet 分布式事务与Optional Package 小结 第8章 SQLJ 简介 什么是SQLJ 准备开始 使用SQLJ SQLJ定制 小结 第9章 数据库...
第7章演示集成Storm和非事务型系统 的复杂性,通过集成Storm和开源探索性分析架构 Druid实现一个可配置的实时系统来分析金融事件。 第8章探讨Lambda体系结构的实现方法,讲解如何 将批处理机制和实时处理引擎结合...