首页 数据库 mysql教程 谈谈分布式事务

谈谈分布式事务

Jun 07, 2016 pm 02:50 PM
事务 分布式 系统

只要牵涉到分布式系统,无论如何都会碰见分布式事务,当然你可以合理的拆分系统,规划表和库的结构,但是这只是减少分布式事务出现的次数,比方说你原来系统中有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直到成功为止

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

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

CUDA之通用矩阵乘法:从入门到熟练! CUDA之通用矩阵乘法:从入门到熟练! Mar 25, 2024 pm 12:30 PM

通用矩阵乘法(GeneralMatrixMultiplication,GEMM)是许多应用程序和算法中至关重要的一部分,也是评估计算机硬件性能的重要指标之一。通过深入研究和优化GEMM的实现,可以帮助我们更好地理解高性能计算以及软硬件系统之间的关系。在计算机科学中,对GEMM进行有效的优化可以提高计算速度并节省资源,这对于提高计算机系统的整体性能至关重要。深入了解GEMM的工作原理和优化方法,有助于我们更好地利用现代计算硬件的潜力,并为各种复杂计算任务提供更高效的解决方案。通过对GEMM性能的优

华为干昆 ADS3.0 智驾系统 8 月上市 享界 S9 首发搭载 华为干昆 ADS3.0 智驾系统 8 月上市 享界 S9 首发搭载 Jul 30, 2024 pm 02:17 PM

7月29日,在AITO问界第四十万台新车下线仪式上,华为常务董事、终端BG董事长、智能汽车解决方案BU董事长余承东出席发表演讲并宣布,问界系列车型将于今年8月迎来华为干昆ADS3.0版本的上市,并计划在8月至9月间陆续推送升级。 8月6日即将发布的享界S9将首发华为ADS3.0智能驾驶系统。华为干昆ADS3.0版本在激光雷达的辅助下,将大幅提升智驾能力,具备融合端到端的能力,并采用GOD(通用障碍物识别)/PDP(预测决策规控)全新端到端架构,提供车位到车位智驾领航NCA功能,并升级CAS3.0全

苹果16系统哪个版本最好 苹果16系统哪个版本最好 Mar 08, 2024 pm 05:16 PM

苹果16系统中版本最好的是iOS16.1.4,iOS16系统的最佳版本可能因人而异添加和日常使用体验的提升也受到了很多用户的好评。苹果16系统哪个版本最好答:iOS16.1.4iOS16系统的最佳版本可能因人而异。根据公开的消息,2022年推出的iOS16被认为是一个非常稳定且性能优越的版本,用户对其整体体验也相当满意。此外,iOS16中新功能的添加和日常使用体验的提升也受到了很多用户的好评。特别是在更新后的电池续航能力、信号表现和发热控制方面,用户的反馈都比较积极。然而,考虑到iPhone14

常用常新!华为Mate60系列升级HarmonyOS 4.2:AI云增强、小艺方言太好用了 常用常新!华为Mate60系列升级HarmonyOS 4.2:AI云增强、小艺方言太好用了 Jun 02, 2024 pm 02:58 PM

4月11日,华为官方首次宣布HarmonyOS4.2百机升级计划,此次共有180余款设备参与升级,品类覆盖手机、平板、手表、耳机、智慧屏等设备。过去一个月,随着HarmonyOS4.2百机升级计划的稳步推进,包括华为Pocket2、华为MateX5系列、nova12系列、华为Pura系列等多款热门机型也已纷纷展开升级适配,这意味着会有更多华为机型用户享受到HarmonyOS带来的常用常新体验。从用户反馈来看,华为Mate60系列机型在升级HarmonyOS4.2之后,体验全方位跃升。尤其是华为M

Linux和Windows系统中cmd命令的区别与相似之处 Linux和Windows系统中cmd命令的区别与相似之处 Mar 15, 2024 am 08:12 AM

Linux和Windows是两种常见的操作系统,分别代表了开源的Linux系统和商业的Windows系统。在这两种操作系统中,都存在着命令行界面,用于用户与操作系统进行交互。在Linux系统中,用户使用的是Shell命令行,而在Windows系统中,用户使用的是cmd命令行。Linux系统中的Shell命令行是一个非常强大的工具,可以完成几乎所有的系统管理任

Oracle数据库中修改系统日期方法详解 Oracle数据库中修改系统日期方法详解 Mar 09, 2024 am 10:21 AM

Oracle数据库中修改系统日期方法详解在Oracle数据库中,修改系统日期的方法主要涉及到修改NLS_DATE_FORMAT参数和使用SYSDATE函数。本文将详细介绍这两种方法及其具体的代码示例,帮助读者更好地理解和掌握在Oracle数据库中修改系统日期的操作。一、修改NLS_DATE_FORMAT参数方法NLS_DATE_FORMAT是Oracle数据

MySQL事务处理:自动提交与手动提交的区别 MySQL事务处理:自动提交与手动提交的区别 Mar 16, 2024 am 11:33 AM

MySQL事务处理:自动提交与手动提交的区别在MySQL数据库中,事务是一组SQL语句的集合,要么全部执行成功,要么全部执行失败,保证了数据的一致性和完整性。在MySQL中,事务可以分为自动提交和手动提交,其区别在于事务提交的时机以及对事务的控制范围。下面将详细介绍自动提交和手动提交的区别,并给出具体的代码示例来说明。一、自动提交在MySQL中,如果没有显示

系统字体存储路径在哪里 系统字体存储路径在哪里 Feb 19, 2024 pm 09:11 PM

系统字体在哪个文件夹在现代的计算机系统中,字体起着至关重要的作用,它影响着我们的阅读体验和文字表达的美观程度。而对于一些热衷于个性化设置和自定义的用户来说,了解系统字体的存储位置就显得尤为重要。那么,系统字体究竟保存在哪个文件夹呢?本文将为大家一一揭晓。在Windows操作系统中,系统字体存放在一个名为“Fonts”的文件夹里。这个文件夹默认位于C盘的Win

See all articles