惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
量子位
A
Arctic Wolf
L
Lohrmann on Cybersecurity
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
WordPress大学
WordPress大学
V
Vulnerabilities – Threatpost
博客园 - Franky
C
Cyber Attacks, Cyber Crime and Cyber Security
The Cloudflare Blog
Last Week in AI
Last Week in AI
The Hacker News
The Hacker News
I
Intezer
J
Java Code Geeks
P
Privacy International News Feed
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
S
Secure Thoughts
Cisco Talos Blog
Cisco Talos Blog
阮一峰的网络日志
阮一峰的网络日志
S
Securelist
Security Latest
Security Latest
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
小众软件
小众软件
Jina AI
Jina AI
有赞技术团队
有赞技术团队
人人都是产品经理
人人都是产品经理
博客园_首页
酷 壳 – CoolShell
酷 壳 – CoolShell
T
The Exploit Database - CXSecurity.com
雷峰网
雷峰网
T
Tenable Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
P
Privacy & Cybersecurity Law Blog
Simon Willison's Weblog
Simon Willison's Weblog
博客园 - 【当耐特】
T
Threat Research - Cisco Blogs
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
MongoDB | Blog
MongoDB | Blog
D
DataBreaches.Net
N
News | PayPal Newsroom
Google Online Security Blog
Google Online Security Blog
K
Kaspersky official blog
H
Help Net Security
宝玉的分享
宝玉的分享
罗磊的独立博客
Webroot Blog
Webroot Blog
月光博客
月光博客
B
Blog RSS Feed
Recorded Future
Recorded Future

微风静语

用 codebase-memory-mcp 给 AI 编程加一层“代码记忆” EchoCraft - 专为独立开发者和小型团队打造的产品官网主题 Halo 站长必备:外链安全与流量分析神器——“链接工具箱”重磅升级! Halo插件开发:java17旧项目迁移至java21项目记录 Halo插件|一个面向创作者的多功能媒体处理工具集 让你的网站初步适配PWA Halo主题 - 微浸:以轻量构建美学,用细节定义体验 深入理解Python爬虫技术:原理、实现与实践 Halo-2.20 新特性:自定义登录页面模版 vue3 中父子组件数据传输踩坑 将你的服务运维面板从宝塔替换为1panel Python实战项目:外星人入侵(源码分享) theme-hao主题适配友链自助提交插件 plugin-artalk 插件保姆级使用教程 plugin-blog-hao 插件部分功能演示 halo 插件开发踩坑记录(一) Thymeleaf 模版引擎语法浅记 信息洪流中的自我救赎 mac 系统里如何管理多个jdk版本 memso API 不完全指南 基础语法:从CPU角度看变量、数组、类型、运算、跳转、函数等语法 halo-theme-hao主题:artalk评论区美化 衡量个人成长 halo-theme-hao 主题魔改教程 分享一个魔改的 Artalk 评论系统邮件模版 halo-theme-hao 主题标签记录 开发一个 Halo2.0 的安全条跳转中台插件! Mac 软件推荐:使用 Mac 一年半来,我一直在用的软件! TypeScript教程---面向对象编程 软件版本命名规范 TypeScript教程---基础语法及编译设置 2024年家乡春季的第一场大雪 提问的智慧 基础篇:容器化部署技术 -—docker,从此摆脱多环境配置的苦恼! 普通本科的四年大学教育,给我带来了什么? 因果与平衡 程序的本质:代码是如何被执行的 软件开发者应该具备的基本提问素质 如何编写 Restful 风格的接口 探索力 Springboot入门基础篇 springboot中如何使用注解来实现aop Springboot项目生成接口文档方法 Java 实体代码生成器 lombok 的使用 深入 Java 泛型 分布式版本控制工具 git 的基本使用 如何搭建前后端分离的项目 初识Vue3--令人焕然一新的使用逻辑和代码组织方式! 浅谈前端发展史 为什么要学习数据结构和算法 关于富文本编辑器 wangeditor 在 vue2 项目中的使用
分布式事务详解:从入门到精通
Handsome · 2025-04-14 · via 微风静语

PS:本文全是理论没有感情😕

image-wejn.png

分布式事务的基本概念

1.1 什么是分布式事务?

分布式事务是指在分布式系统中,多个独立的服务或节点之间协同完成的一个事务操作。这个事务操作需要满足ACID特性(原子性、一致性、隔离性和持久性)。

  • 原子性(Atomicity):在分布式事务中,所有参与事务的服务或节点协同完成操作,形成一个完整的事务单元。这个单元中的一系列操作要么全部成功提交,确保事务的完整性和数据的一致性,要么在出现错误或异常时全部回滚撤销,保证事务的原子性。
  • 一致性(Consistency):在分布式事务中,所有参与事务的服务或节点必须确保数据在逻辑上的一致性,即使系统发生异常或故障,也必须保证数据的准确性和完整性。
  • 隔离性(Isolation):在分布式事务环境中,各参与事务的服务或节点间的操作具有高度的独立性,彼此之间的操作相互隔离,确保一个事务的执行不会受到其他并发事务的干扰。这种隔离性保障了事务的原子性和一致性,从而提升了系统的稳定性和可靠性。
  • 持久性(Durability):在分布式事务环境中,一旦事务成功提交,其处理结果将被永久性地存储在各个参与事务的服务节点或本地存储中,确保数据的持久性。即使在系统遭遇异常或故障的情况下,已提交的事务结果依然保持可靠且不会丢失。

事务原本主要局限于对单一数据库资源的访问控制,但随着架构服务化的趋势,事务的概念得到了进一步的拓展和应用。当我们将一个服务操作视为一个整体的事务时,这个服务操作应当仅涉及一个特定的数据库资源。这类事务,基于单个服务对单一数据库资源的访问,被称为本地事务(Local Transaction)。

1.2 分布式事务的背景

48bda83a-caa1-4fe2-8d56-d2ff521d1e10.jpeg

引发思考:

随着微服务架构的普及,系统被拆分为多个独立的服务,每个服务运行在不同的节点上。当这些服务需要协同完成一个业务操作时,就涉及到分布式事务的问题。

  1. 在本地环境中,事务主要局限于单个会话内,不涉及跨多个数据库资源的操作。然而,随着基于SOA的分布式应用的普及,对访问多个数据库资源和多种服务的需求日益增长,需要在同一事务中整合这些操作。因此,分布式事务应运而生。
  2. 分布式事务是指事务的操作跨越不同的节点或服务进行。由于事务的各个操作位于不同的位置,需要服务间的远程协作来完成整个事务操作。在这种分布式系统环境下,不同服务通过网络进行远程协作以完成事务,这被称为分布式事务。
  3. 分布式事务的核心是保证其中的小操作要么全部成功执行,要么全部失败回滚。其本质目的是确保在不同数据库间的数据保持一致性。

CAP定理

分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。

  • 一致性(Consistency):在分布式系统中,所有的数据备份在某一时刻拥有相同的值。
  • 可用性(Availability):确保每个请求都能得到响应,无论请求是否成功。
  • 分区容错性(Partition tolerance):即使在部分组件出现故障或网络分区的情况下,系统仍然能够继续操作并提供服务。

BASE理论

BASE理论是CAP理论中有关一致性和可用性的权衡结果。其核心思想在于:在分布式系统中,无法同时实现强一致性和所有请求的即时可用性。然而,根据每个应用的业务特点,我们可以通过牺牲部分一致性来确保系统的基本可用性。这种平衡体现在三个方面:Basically Available(基本可用)、Soft state(软状态)和Eventually consistent(最终一致性)。通过采用这些原则,我们可以使系统达到最终一致性,同时保持足够的可用性。

酸碱平衡

ACID属性确保事务的强一致性及数据的实时一致性,在本地事务中这是可行的。但在分布式事务环境中,强一致性可能会对分布式系统的性能产生影响。因此,分布式系统通常遵循Base理论。然而,不同业务场景对一致性的要求是不同的。例如,在交易场景中,需要保证强一致性以确保数据的准确性和完整性;而在发送短信验证码的场景中,对实时性要求不高,可以遵循Base理论的要求。这种在不同场景下对一致性的灵活调整,可以看作是一种“酸碱平衡”的理念,以优化系统性能和满足业务需求。

分布式事务的核心技术

2.1最佳实践

5102b6c5-9f2a-4a2c-8327-ca57270e5561.gif

一如既往的电子订单系统,用户下单后,需要更新库存、扣减用户积分、生成订单等多个服务协同完成!

就是说用户的一个操作我们需要访问三个不同的微服务和三个不同的数据库 行为如下

image-wejn.png

这这三件事实际上构成了一个完整的业务流程,每一步都至关重要,缺少任何一个环节都会导致整个流程的失败。它们包括更新库存、扣减用户积分以及生成订单,每一步都必须成功执行,以确保事务的一致性。如果其中任何一个环节出现问题或失败,都必须进行回滚操作,以确保数据的完整性和准确性。这就体现了事务的一致性要求,即在分布式系统中,多个操作必须作为一个整体一起提交或回滚,以确保数据的逻辑一致性和系统的可靠性。

3.1 基于XA协议的JTA事务管理

3.1.1 XA协议概述

XA协议是由X/Open组织提出的一种分布式事务管理协议。其核心作用在于协调不同资源管理器之间的事务,确保数据在各种操作过程中的一致性和完整性。

3.1.2 JTA(Java Transaction API)与XA协议的结合

在Java平台上,JTA作为事务管理API,完美支持基于XA协议的分布式事务管理。其主要组件包括:

一、UserTransaction

  • 是JTA中用于管理全局事务的核心接口。通过此接口,开发者可以编程控制事务的提交、回滚等关键操作。

二、TransactionManager

  • 负责注册和管理资源管理器。通过此接口,系统可以协调各个资源管理器之间的事务,确保事务的原子性和一致性。此外,它还提供了一系列功能,如事务的挂起、恢复等。

综上所述,JTA与XA协议的结合,为Java平台上的分布式事务管理提供了强大而灵活的工具。

3.2 基于Spring的分布式事务

3.2.1 Spring的事务管理概览

Spring框架提供了两种主要的事务管理方式:声明式事务管理和编程式事务管理。

声明式事务管理:通过注解或XML配置文件,以简洁的方式定义事务的边界和操作属性。这种方式使得业务逻辑与事务管理分离,降低了代码的复杂性。

编程式事务管理:在这种方式下,开发者需要手动编写代码来控制事务的开启、提交和回滚。虽然这种方式相对繁琐,但在某些特定场景下(如需要动态决定事务属性时)仍然有其用途。

3.2.2 Spring与JTA的集成

Spring可以与Java事务API(JTA)无缝集成,支持基于XA协议的分布式事务处理。这种集成提供了在分布式系统中进行复杂事务管理的能力,增强了Spring事务管理的功能。

3.3 基于TCC(Try-Confirm-Cancel)模式

3.3.1 概念简述

TCC模式是一种基于补偿机制的分布式事务管理方法。其核心流程包括三个主要阶段:尝试阶段(Try阶段)、确认阶段(Confirm阶段)和取消阶段(Cancel阶段)。在Try阶段,尝试执行本地事务操作;在Confirm阶段,若事务操作成功,则确认提交本地事务;若事务操作失败,则进入Cancel阶段,回滚本地事务。

3.3.2 实现方法

为实现TCC模式,可以采用Saga模式或自定义的补偿逻辑。通过这两种方式,可以有效地实现分布式事务的补偿管理,确保数据的一致性和系统的稳定性。

3.4 基于MQ的消息可靠传输 推荐

利用Kafka或RabbitMQ等消息队列技术,我们可以实现分布式事务的可靠传输。在这个过程中:

  1. 生产者:负责将事务相关的消息发送到消息队列中。这些消息可能包含触发事务的指令或数据。
  2. 消费者:从消息队列中接收消息,并根据接收到的消息执行相应的本地事务操作。在消费消息时,消费者需要确保事务的完整性和一致性,以便实现分布式系统的可靠传输。通过这一机制,我们可以确保即使在分布式环境中,事务的处理也能保持高效和可靠。

PS:本文全是理论没有感情

分布式事务的基本概念

1.1 什么是分布式事务?

分布式事务是指在分布式系统中,多个独立的服务或节点之间协同完成的一个事务操作。这个事务操作需要满足ACID特性(原子性、一致性、隔离性和持久性)。

  • 原子性(Atomicity):在分布式事务中,所有参与事务的服务或节点协同完成操作,形成一个完整的事务单元。这个单元中的一系列操作要么全部成功提交,确保事务的完整性和数据的一致性,要么在出现错误或异常时全部回滚撤销,保证事务的原子性。
  • 一致性(Consistency):在分布式事务中,所有参与事务的服务或节点必须确保数据在逻辑上的一致性,即使系统发生异常或故障,也必须保证数据的准确性和完整性。
  • 隔离性(Isolation):在分布式事务环境中,各参与事务的服务或节点间的操作具有高度的独立性,彼此之间的操作相互隔离,确保一个事务的执行不会受到其他并发事务的干扰。这种隔离性保障了事务的原子性和一致性,从而提升了系统的稳定性和可靠性。
  • 持久性(Durability):在分布式事务环境中,一旦事务成功提交,其处理结果将被永久性地存储在各个参与事务的服务节点或本地存储中,确保数据的持久性。即使在系统遭遇异常或故障的情况下,已提交的事务结果依然保持可靠且不会丢失。

事务原本主要局限于对单一数据库资源的访问控制,但随着架构服务化的趋势,事务的概念得到了进一步的拓展和应用。当我们将一个服务操作视为一个整体的事务时,这个服务操作应当仅涉及一个特定的数据库资源。这类事务,基于单个服务对单一数据库资源的访问,被称为本地事务(Local Transaction)。

1.2 分布式事务的背景

48bda83a-caa1-4fe2-8d56-d2ff521d1e10.jpeg

引发思考:

随着微服务架构的普及,系统被拆分为多个独立的服务,每个服务运行在不同的节点上。当这些服务需要协同完成一个业务操作时,就涉及到分布式事务的问题。

  1. 在本地环境中,事务主要局限于单个会话内,不涉及跨多个数据库资源的操作。然而,随着基于SOA的分布式应用的普及,对访问多个数据库资源和多种服务的需求日益增长,需要在同一事务中整合这些操作。因此,分布式事务应运而生。
  2. 分布式事务是指事务的操作跨越不同的节点或服务进行。由于事务的各个操作位于不同的位置,需要服务间的远程协作来完成整个事务操作。在这种分布式系统环境下,不同服务通过网络进行远程协作以完成事务,这被称为分布式事务。
  3. 分布式事务的核心是保证其中的小操作要么全部成功执行,要么全部失败回滚。其本质目的是确保在不同数据库间的数据保持一致性。

CAP定理

分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。

  • 一致性(Consistency):在分布式系统中,所有的数据备份在某一时刻拥有相同的值。
  • 可用性(Availability):确保每个请求都能得到响应,无论请求是否成功。
  • 分区容错性(Partition tolerance):即使在部分组件出现故障或网络分区的情况下,系统仍然能够继续操作并提供服务。

BASE理论

BASE理论是CAP理论中有关一致性和可用性的权衡结果。其核心思想在于:在分布式系统中,无法同时实现强一致性和所有请求的即时可用性。然而,根据每个应用的业务特点,我们可以通过牺牲部分一致性来确保系统的基本可用性。这种平衡体现在三个方面:Basically Available(基本可用)、Soft state(软状态)和Eventually consistent(最终一致性)。通过采用这些原则,我们可以使系统达到最终一致性,同时保持足够的可用性。

酸碱平衡

ACID属性确保事务的强一致性及数据的实时一致性,在本地事务中这是可行的。但在分布式事务环境中,强一致性可能会对分布式系统的性能产生影响。因此,分布式系统通常遵循Base理论。然而,不同业务场景对一致性的要求是不同的。例如,在交易场景中,需要保证强一致性以确保数据的准确性和完整性;而在发送短信验证码的场景中,对实时性要求不高,可以遵循Base理论的要求。这种在不同场景下对一致性的灵活调整,可以看作是一种“酸碱平衡”的理念,以优化系统性能和满足业务需求。

分布式事务的核心技术

2.1最佳实践

5102b6c5-9f2a-4a2c-8327-ca57270e5561.gif

一如既往的电子订单系统,用户下单后,需要更新库存、扣减用户积分、生成订单等多个服务协同完成!

就是说用户的一个操作我们需要访问三个不同的微服务和三个不同的数据库 行为如下

image-wejn.png

这这三件事实际上构成了一个完整的业务流程,每一步都至关重要,缺少任何一个环节都会导致整个流程的失败。它们包括更新库存、扣减用户积分以及生成订单,每一步都必须成功执行,以确保事务的一致性。如果其中任何一个环节出现问题或失败,都必须进行回滚操作,以确保数据的完整性和准确性。这就体现了事务的一致性要求,即在分布式系统中,多个操作必须作为一个整体一起提交或回滚,以确保数据的逻辑一致性和系统的可靠性。

3.1 基于XA协议的JTA事务管理

3.1.1 XA协议概述

XA协议是由X/Open组织提出的一种分布式事务管理协议。其核心作用在于协调不同资源管理器之间的事务,确保数据在各种操作过程中的一致性和完整性。

3.1.2 JTA(Java Transaction API)与XA协议的结合

在Java平台上,JTA作为事务管理API,完美支持基于XA协议的分布式事务管理。其主要组件包括:

一、UserTransaction

  • 是JTA中用于管理全局事务的核心接口。通过此接口,开发者可以编程控制事务的提交、回滚等关键操作。

二、TransactionManager

  • 负责注册和管理资源管理器。通过此接口,系统可以协调各个资源管理器之间的事务,确保事务的原子性和一致性。此外,它还提供了一系列功能,如事务的挂起、恢复等。

综上所述,JTA与XA协议的结合,为Java平台上的分布式事务管理提供了强大而灵活的工具。

3.2 基于Spring的分布式事务

3.2.1 Spring的事务管理概览

Spring框架提供了两种主要的事务管理方式:声明式事务管理和编程式事务管理。

声明式事务管理:通过注解或XML配置文件,以简洁的方式定义事务的边界和操作属性。这种方式使得业务逻辑与事务管理分离,降低了代码的复杂性。

编程式事务管理:在这种方式下,开发者需要手动编写代码来控制事务的开启、提交和回滚。虽然这种方式相对繁琐,但在某些特定场景下(如需要动态决定事务属性时)仍然有其用途。

3.2.2 Spring与JTA的集成

Spring可以与Java事务API(JTA)无缝集成,支持基于XA协议的分布式事务处理。这种集成提供了在分布式系统中进行复杂事务管理的能力,增强了Spring事务管理的功能。

3.3 基于TCC(Try-Confirm-Cancel)模式

3.3.1 概念简述

TCC模式是一种基于补偿机制的分布式事务管理方法。其核心流程包括三个主要阶段:尝试阶段(Try阶段)、确认阶段(Confirm阶段)和取消阶段(Cancel阶段)。在Try阶段,尝试执行本地事务操作;在Confirm阶段,若事务操作成功,则确认提交本地事务;若事务操作失败,则进入Cancel阶段,回滚本地事务。

3.3.2 实现方法

为实现TCC模式,可以采用Saga模式或自定义的补偿逻辑。通过这两种方式,可以有效地实现分布式事务的补偿管理,确保数据的一致性和系统的稳定性。

3.4 基于MQ的消息可靠传输 推荐

利用Kafka或RabbitMQ等消息队列技术,我们可以实现分布式事务的可靠传输。在这个过程中:

  1. 生产者:负责将事务相关的消息发送到消息队列中。这些消息可能包含触发事务的指令或数据。
  2. 消费者:从消息队列中接收消息,并根据接收到的消息执行相应的本地事务操作。在消费消息时,消费者需要确保事务的完整性和一致性,以便实现分布式系统的可靠传输。通过这一机制,我们可以确保即使在分布式环境中,事务的处理也能保持高效和可靠。