首页 > 其他分享 >聊聊什么是分布式事务

聊聊什么是分布式事务

时间:2023-06-14 14:34:46浏览次数:55  
标签:事务 调用 服务 数据库 实例 聊聊 分布式

概述

分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上,以上是百度百科的解释。

简单的说,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败。本质上来说,分布式事务就是为了保证数据库中的数据一致性以及原子性。

分布式事务产生的场景

查询了下,发现网上有很多人已经总结了,这里我先搬过来,然后在分析下,因为我觉得说的不清晰。

跨JVM进程产生分布式事务

典型的场景就是微服务架构:微服务之间通过远程调用完成各自的事务操作。比如:订单微服务和库存微服务,下单的同时订单微服务请求库存微服务减少库存。

image

跨数据库实例产生分布式事务

单体系统访问多个数据库实例当单体系统需要访问多个数据库(实例)时就会产生分布式事务。比如:用户信息和订单信息分别在两个MySQL实例存储,用户管理系统删除用户信息,需要分别删除用户信息及用户的订单信息,由于数据分布在不同的数据实例,需要通过不同的数据库链接去操作数据,此时产生分布式事务。

image

多服务访问同一个数据库实例

订单微服务和库存微服务即使访问同一个数据库也会产生分布式事务,不过这情况比较少,只有在跨服务访问的时候才会出现。

image

分布式服务调用链路

第一种,事务嵌套

image

第二种,事务分离

image

这两种是事务调用的最常见也是最典型的场景,但是都有一个问题,也是导致在多服务访问同一个数据库实例中出现分布式事务的场景:当远程调用让Service B成功了,由于网络问题远程调用并没有返回,此时本地事务提交失败就回滚了Service A的操作,此时Service A与Service B的数据就不一致了。

所以,不管是多数据库还是多应用服务的场景下的应用分布式部署,对于某一个业务下(比如订单扣减),一旦有异常,都需要回滚,一旦事务都成功了,都需要成功;而这中间有一个最大的影响因素,就是远程调用。由于远程调用的阻碍性,Serivce A与Service B并不能感知到彼此的事务是否执行成功,也就不能正确的回滚或是提交。而对于分布式解决方案的应用,其解决的就是这层远程调用的态势感知;即,根据各服务事务(分支事务)的执行情况来具体判断是否事务可以提交,而不是被远程调用所影响。

Seata的AT模式就是中间加了一层协调器TC,管理分支事务的执行状态;而Sagas模式则是通过事务的执行状态在事务间的传递来控制分支事务的提交与回滚。

《分布式事务》

标签:事务,调用,服务,数据库,实例,聊聊,分布式
From: https://www.cnblogs.com/zhiyong-ITNote/p/17480124.html

相关文章

  • 事务的属性
    代码写在course28中1. 事务属性包括哪些  1231.1 事务中的重点属性: 123● 事务传播行为● 事务隔离级别● 事务超时● 只读事务● 设置出现哪些异常回滚事务● 设置出现哪些异常不回滚事务2. 事务传播行为  1232.1 什么是事务的传播行为?  123在service类中有a()方......
  • python对接事务性MSMQ队列
    研究了很久,逐步了解到原理后,发现python发送消息到事务性msmq肯定可行。现在能搜到的资源没有任何一篇文章说明了这个,包括gpt都一样。废话不多说,直接上代码 importwin32com.client#关键代码必须使用gencache导入"MSMQ.MSMQQueueInfo"win32com.client.gencache.Ensure......
  • go实现高并发高可用分布式系统:设计类似kafka的高并发海量数据存储机制2
    上一节我们完成了数据的存储和索引,本节我们看如何写入数据和进行查询。我们将创建一个Segment对象,它一方面接收发送来的请求,也就是Record数据结构,然后将数据写入到store和index,基本架构如下:在前面章节中,我们使用代码定义了Record的数据结构,现在我们需要使用protobuf来重新定义它,一......
  • GO实现高可用高并发分布式系统:gRPC实现客户端与服务端的一对一通讯
    分布式系统的特点是不同的功能模块会以独立服务器程序的方式运行在不同主机上。当服务A想请求位于另一台机器的服务B完成特定请求时,就必须将要处理的数据提交给B。这个过程就涉及到一系列问题,首先A需要把数据进行序列化然后通过网络连接发送给B,B接收到数据后需要进行反序列化得到数......
  • go实现高并发高可用分布式系统:设计类似kafka的高并发海量数据存储机制1
    上一节我们实现了日志微服务,它以http服务器的模式运行,客户端通过json方式将日志数据post过来,然后通过httpget的方式读取日志。当时我们的实现是将所有日志信息添加到数组末尾,这意味着所有日志信息都会保存在内存中。但分布式系统的日志数量将非常巨大,例如推特一天的日志数量就达到......
  • 谈论关于Redis产生的分布式ID获取为空问题
    一:事故在项目测试中,遇到一个事件创建失败问题,追踪日志发现分布式ID的获取值为空,导致后续表写入异常。经排查锁定相关方法,具体方法经简化如下:@TransactionalpublicStringtestRedisTrans(){redisTemplate.setEnableTransactionSupport(t......
  • minio分布式文件存储系统
    1什么是minio?MinlO是一个基于ApacheLicensev2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据。例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。MinlO是一个非常轻量的......
  • Spring如何实现事务
    参考:spring事务管理(详解和实例):https://www.cnblogs.com/yixianyixian/p/8372832.htmlSpring事物四种实现方式:基于编程式事务管理实现基于TransactionProxyFactoryBean的声明式事务管理基于AspectJ的XML声明式事务管理基于注解的声明式事务管理参考:https://blog.csdn.net/zhux......
  • 对接三方支付平台 + 分布式锁
    一、对接三方支付平台第三方支付平台是指平台提供商在商家和银行之间建立连接,供以支付等交易活动1.1支付宝支付、微信支付……(以支付宝为例)1、通过支付宝的开放平台对接:https://open.alipay.com/2、进入平台API的当面付:https://open.alipay.com/api3、需要支付宝账号,......
  • Redis系列16:聊聊布隆过滤器(原理篇)
    Redis系列1:深刻理解高性能Redis的本质Redis系列2:数据持久化提高可用性Redis系列3:高可用之主从架构Redis系列4:高可用之Sentinel(哨兵模式)Redis系列5:深入分析Cluster集群模式追求性能极致:Redis6.0的多线程模型追求性能极致:客户端缓存带来的革命Redis系列8:Bitmap实现亿万级......