热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

谈谈分布式事务

只要牵涉到分布式系统,无论如何都会碰见分布式事务,当然你可以合理的拆分系统,规划表和库的结构,但是这只是减少分布式事务出现的次数,比方说你原来系统中有5处地方会有分布式事务,现在一优化可能只有3处地方有了,但是你要一点也没有,个人认为不大可

只要牵涉到分布式系统,无论如何都会碰见分布式事务,当然你可以合理的拆分系统,规划表和库的结构,但是这只是减少分布式事务出现的次数,比方说你原来系统中有5处地方会有分布式事务,现在一优化可能只有3处地方有了,但是你要一点也没有,个人认为不大可

只要牵涉到分布式系统,无论如何都会碰见分布式事务,当然你可以合理的拆分系统,规划表和库的结构,但是这只是减少分布式事务出现的次数,比方说你原来系统中有5处地方会有分布式事务,现在一优化可能只有3处地方有了,但是你要一点也没有,个人认为不大可能

接下来谈谈什么情况下会产生分布式事务?


一: 同数据库,不同web容器

上图可知,我们的订单系统和库存系统连着相同的数据源,该数据源里面也只有一个database,里面存放着订单表和库存表。因为订单系统和库存系统是两个不同的系统,部署在了两台服务器上面,他们之间通过接口进行调用,所以虽然它们两张表在同一个数据库里面,但是我们无法进行事务操控。从业务上来讲,当我们下单的时候,商品的库存一定要扣除,不能库存扣了,订单没生成,或者说订单生成了,库存没扣,这样不就乱套了么?所以扣库存和生成订单这两步操作,必须要么全做,要么全不做,这就牵涉到了分布式事务。


二 :不同数据源,相同web容器


这次我们把下单操作和扣库存的操作写在了同一个系统里面并且部署在了一台服务器上面,这个系统连接着两个数据源,分别是订单数据库和库存数据库。显然,虽说我们吧业务逻辑写在一个系统里面了,但是你连着两个数据源,所以又出现了分布式事务。


三不同数据库,不同web容器



第三种情况有点类似于,第一和第二种的结合。每个系统操纵自己的数据库,系统之间通过接口调用,很明显必然又要出现分布式事务


四 单表分片的情况


有的时候一张表的数量实在是太大了,而且增速过猛,那么无可奈何,只能把这张表拆分成好几份存放到不同的数据库服务器上面,有人会说这为什么也会产生分布式事务呢?根据上面那张图我举个例子,假如库存表分片1存的是上海仓库的商品库存信息,库存表分片2存的是北京仓库的商品库存信息,现在我要进行调货操作,从上海仓库调走500台iPhone手机到北京仓库,这个时候我们就要对分片1进行扣减500的操作,而对分片2进行增加500的操作,那么我们这个操作可以允许失败么?我分片1(上海仓库)的500台扣减掉了,但是分片2(北京仓库)没有增加成功?这显然是不可以的,所以这牵涉到了分布式事务,当然我这里只是举一个例子,因为你牵涉到了对同一张表的两条以上的记录进行修改操作,所以引出了分布式事务。


上面我们聊了什么样的情况下会出现分布式事务,接下来说下解决办法

一:jta(二阶段提交)

实际上jta严格来说不能解决分布式事务,比方说我上面举的第一种情况,我是单数据源,不同web容器,你用jta怎么解决?jta只能解决多数据源下的事务,而且对系统的吞吐量影响极大。


二:补偿法

这个是目前最常用的方法


首先我们需要把我们的业务划分到最细,让每个业务成为原子业务,比方说我们有一个业务现在可以划分成3个原子业务,业务A,业务B,业务C。这些业务操作可以是你直接操作数据库,也可以是调用别的系统的接口


假设我们现在业务A业务B都执行成功,但是业务C这里失败了。那么我们有两条路可以走。

第一条:把业务A和业务B回滚,也就是撤销业务A和业务B。

第二条:继续执行业务C直到成功为止

这两种方向我们也叫做正推和逆推,实际上第二种是我们常用的,如果你逆推的话把前面做的都撤销掉了,我感觉意义不大,当你产生补偿的行为的时候,我们的主流程实际上已经走通了,比方说你下单操作,用户点完下单之后,你告诉它你已经成功下单,好了接下来和用户没关系了,这个就叫主流程结束了。但是你的下单流程里面包含了库存的调配,比方说我在上海下的订单,要去北京库房调货,那么牵涉到分布式事务(可以参照分布式事务的第四种情况),好了现在调北京库房调用失败,那么我开始逆推把订单给删了,你觉得合适么?还是说我继续正推,直到我调用成功为止,用户那边我只要在订单上显示正在配货中就可以了,反正你要把订单都给删了,那会是一个很不好的体验


推荐阅读
  • 热璞数据库与云宏达成兼容性互认证,共筑数据安全屏障
    热璞数据库与云宏信息技术有限公司近期宣布完成产品兼容性互认证,旨在提升数据安全性与稳定性,支持企业数字化转型。 ... [详细]
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • ServletContext接口在Java Web开发中扮演着重要角色,它提供了一种方式来获取关于整个Web应用程序的信息。通过ServletContext,开发者可以访问初始化参数、共享数据以及应用资源。 ... [详细]
  • 本文探讨了大型服务端开发过程中常见的几个误区,包括异步任务处理不当、日志同步模式使用、网络操作未设置超时、缓存命中率及响应时间未统计、单一缓存模式、分布式缓存加锁不当以及团队管理上的误区,旨在帮助开发者避免这些常见错误。 ... [详细]
  • 本文将详细介绍如何在ThinkPHP6框架中实现多数据库的部署,包括读写分离的策略,以及如何通过负载均衡和MySQL同步技术优化数据库性能。 ... [详细]
  • 性能测试工具的选择与应用
    本文探讨了性能测试工具的重要性及其在软件测试中的作用,重点介绍了选择合适性能测试工具的考量因素,并对几种常用的性能测试工具进行了对比分析。 ... [详细]
  • 容器与微服务基础:快速入门指南
    探索容器和微服务的基础知识,了解如何通过先进的应用性能管理(APM)工具提升监控效能。加入AppDynamics APM的导览,掌握容器与微服务实施及监控的最佳实践。 ... [详细]
  • Spring Cloud因其强大的功能和灵活性,被誉为开发分布式系统的‘一站式’解决方案。它不仅简化了分布式系统中的常见模式实现,还被广泛应用于企业级生产环境中。本书内容详实,覆盖了从微服务基础到Spring Cloud的高级应用,适合各层次的开发者。 ... [详细]
  • window下kafka的安装以及测试
    目录一、安装JDK(需要安装依赖javaJDK)二、安装Kafka三、测试参考在Windows系统上安装消息队列kafka一、安装JDKÿ ... [详细]
  • 本文详细介绍了使用ZooKeeper构建高可用集群的方法,包括必要的软件环境准备、配置文件调整及集群启动等关键步骤。通常,一个ZooKeeper集群由奇数个节点组成,以确保Leader选举的有效性。 ... [详细]
  • 本文档详细介绍了在 Kubernetes 集群中部署 ETCD 数据库的过程,包括实验环境的准备、ETCD 证书的生成及配置、以及集群的启动与健康检查等关键步骤。 ... [详细]
  • 本文探讨了使用Filter作为控制器的优势,以及Servlet与Filter之间的主要差异。同时,详细解析了Servlet的工作流程及其生命周期,以及ServletConfig与ServletContext的区别与应用场景。 ... [详细]
  • 三星Galaxy S8/S8+即将登场,全面解析新旗舰
    3月29日晚11点,备受瞩目的三星Galaxy S8/S8+将正式发布。作为三星在Note 7爆炸事件后的重磅产品,S8/S8+不仅承载着恢复消费者信心的重任,其创新的设计和技术也备受期待。 ... [详细]
  • 深入分析十大PHP开发框架
    随着PHP技术的发展,各类开发框架层出不穷,成为了开发者们热议的话题。本文将详细介绍并对比十款主流的PHP开发框架,旨在帮助开发者根据自身需求选择最合适的工具。 ... [详细]
  • 利用Python实现自动化群发邮件
    本文详细介绍如何使用Python语言来实现邮件的自动群发功能,适合希望提高工作效率的技术爱好者和开发者。 ... [详细]
author-avatar
kikokikolove
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有