当前位置: 首页 > news >正文

分布式事务:理论与实践

分布式事务:理论与实践

在现代分布式系统中,分布式事务是一种确保跨多个独立系统的一致性和完整性的方法。本文将介绍分布式事务的基本概念、实现方式、在Java中的具体实现以及在实际应用中的案例。

分布式事务的基本概念

分布式事务涉及多个独立的数据库或系统,在这些系统之间进行协调以确保数据的一致性。其目标是使得分布式系统中的多个操作要么全部成功,要么全部失败,从而保持系统的一致状态。

事务的ACID特性

在讨论分布式事务之前,首先需要了解事务的ACID特性:

  1. 原子性 (Atomicity):事务中的所有操作要么全部完成,要么全部不完成。
  2. 一致性 (Consistency):事务在完成时,必须使数据库从一个一致性状态转变为另一个一致性状态。
  3. 隔离性 (Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
  4. 持久性 (Durability):事务一旦完成,其对数据库的更改应永久保存下来,即使系统发生故障。

分布式事务的实现方式

实现分布式事务的方式有多种,以下是常见的几种:

二阶段提交协议(2PC)

二阶段提交协议(Two-Phase Commit Protocol, 2PC)是一种经典的分布式事务管理方法。它将事务提交分为两个阶段:准备阶段和提交阶段。

  1. 准备阶段:协调者向所有参与者发送准备请求,并等待参与者反馈。参与者在收到请求后,执行事务并记录日志,然后返回准备就绪或失败。
  2. 提交阶段:如果所有参与者都返回准备就绪,协调者向所有参与者发送提交请求;如果有任何参与者返回失败,协调者向所有参与者发送回滚请求。

三阶段提交协议(3PC)

三阶段提交协议(Three-Phase Commit Protocol, 3PC)是对2PC的改进,主要在准备和提交之间增加了一个准备提交阶段,以减少协调者和参与者在等待状态下的阻塞时间。

  1. 准备阶段:与2PC相同。
  2. 准备提交阶段:协调者在收到所有参与者的准备就绪响应后,向所有参与者发送准备提交请求,并等待参与者确认。
  3. 提交阶段:如果所有参与者都确认准备提交,协调者发送提交请求;否则发送回滚请求。

基于消息队列的分布式事务

在一些场景中,使用消息队列可以有效地实现分布式事务。通过消息队列,系统可以实现事件驱动架构,在确保消息可靠传递的基础上,实现分布式系统中的事务一致性。

  1. 事件发送:事务发起方在本地事务完成后,将事件发送到消息队列。
  2. 事件处理:消息队列将事件分发给各个订阅者,各订阅者在处理事件时执行相应的本地事务。
  3. 事件确认:订阅者在本地事务完成后,向消息队列发送确认消息。

Java中的2PC实现

在Java中,有几种框架和技术可以实现2PC协议,最常见的是通过Java事务API(JTA)、XA规范以及分布式事务管理器(如Atomikos和Narayana)来实现。

Java事务API(JTA)

JTA是Java EE中的一部分,提供了一组标准的API用于管理分布式事务。JTA包含两个主要接口:

  • UserTransaction:用于管理事务的生命周期(开始、提交、回滚)。
  • TransactionManager:用于管理资源(如数据库连接)的事务上下文。
示例代码
import javax.transaction.UserTransaction;
import javax.naming.InitialContext;public class DistributedTransactionExample {public static void main(String[] args) {UserTransaction utx = null;try {InitialContext ctx = new InitialContext();utx = (UserTransaction) ctx.lookup("java:comp/UserTransaction");utx.begin();// 执行分布式事务操作performDistributedOperations();utx.commit();} catch (Exception e) {if (utx != null) {try {utx.rollback();} catch (Exception rollbackEx) {rollbackEx.printStackTrace();}}e.printStackTrace();}}private static void performDistributedOperations() {// 执行跨多个数据库或系统的操作}
}

XA规范

XA是由X/Open组织提出的分布式事务处理标准。它定义了一套接口,允许全局事务管理器和本地资源管理器(如数据库)之间进行通信。Java通过JTA支持XA规范。

示例代码
import javax.transaction.xa.XAResource;
import javax.transaction.xa.Xid;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;public class XADistributedTransactionExample {public static void main(String[] args) throws Exception {// 获取数据库连接Connection conn1 = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1", "user", "password");Connection conn2 = DriverManager.getConnection("jdbc:mysql://localhost:3306/db2", "user", "password");// 获取XAResourceXAResource xaRes1 = conn1.unwrap(XAResource.class);XAResource xaRes2 = conn2.unwrap(XAResource.class);// 创建XidXid xid1 = createXid(1);Xid xid2 = createXid(2);try {// 开始分布式事务xaRes1.start(xid1, XAResource.TMNOFLAGS);xaRes2.start(xid2, XAResource.TMNOFLAGS);// 执行SQL操作PreparedStatement ps1 = conn1.prepareStatement("INSERT INTO table1 (col1) VALUES (?)");ps1.setString(1, "value1");ps1.executeUpdate();PreparedStatement ps2 = conn2.prepareStatement("INSERT INTO table2 (col1) VALUES (?)");ps2.setString(1, "value2");ps2.executeUpdate();// 结束分布式事务xaRes1.end(xid1, XAResource.TMSUCCESS);xaRes2.end(xid2, XAResource.TMSUCCESS);// 准备提交int prp1 = xaRes1.prepare(xid1);int prp2 = xaRes2.prepare(xid2);// 提交if (prp1 == XAResource.XA_OK && prp2 == XAResource.XA_OK) {xaRes1.commit(xid1, false);xaRes2.commit(xid2, false);}} catch (Exception e) {// 回滚xaRes1.rollback(xid1);xaRes2.rollback(xid2);e.printStackTrace();}}private static Xid createXid(int id) {// 创建Xid实例的逻辑return new MyXid(id);}// Xid实现类static class MyXid implements Xid {private int id;MyXid(int id) {this.id = id;}public int getFormatId() {return id;}public byte[] getGlobalTransactionId() {return new byte[0];}public byte[] getBranchQualifier() {return new byte[0];}}
}

Atomikos

Atomikos是一个流行的Java分布式事务管理器,支持JTA规范,并提供对2PC的支持。它易于集成且性能良好。

示例代码
import com.atomikos.icatch.jta.UserTransactionManager;
import javax.transaction.UserTransaction;public class AtomikosExample {public static void main(String[] args) {UserTransactionManager utm = new UserTransactionManager();UserTransaction utx = utm.getUserTransaction();try {utx.begin();// 执行分布式事务操作performDistributedOperations();utx.commit();} catch (Exception e) {try {utx.rollback();} catch (Exception rollbackEx) {rollbackEx.printStackTrace();}e.printStackTrace();}}private static void performDistributedOperations() {// 执行跨多个数据库或系统的操作}
}

分布式事务的应用案例

电商平台中的订单处理

在电商平台中,订单处理通常涉及多个独立系统,例如订单系统、支付系统和库存系统。通过分布式事务,可以确保订单的各个操作在不同系统中一致完成,避免出现支付成功但库存未更新的情况。

银行转账系统

在银行转账系统中,转账操作需要同时更新多个账户的余额,通过分布式事务,可以确保转出账户和转入账户的余额更新一致,避免资金丢失或不一致的情况。

参考链接

  • 分布式事务:https://en.wikipedia.org/wiki/Distributed_transaction
  • 二阶段提交协议:https://en.wikipedia.org/wiki/Two-phase_commit_protocol
  • 三阶段提交协议:https://en.wikipedia.org/wiki/Three-phase_commit_protocol
  • 基于消息队列的事务:https://www.cloudamqp.com/blog/part1-rabbitmq-for-beginners-what-is-rabbitmq.html
  • Java事务API(JTA):https://docs.oracle.com/javaee/7/tutorial/transactions.htm
  • Atomikos:https://www.atomikos.com/Documentation/HowToUse

在这里插入图片描述

相关文章:

分布式事务:理论与实践

分布式事务:理论与实践 在现代分布式系统中,分布式事务是一种确保跨多个独立系统的一致性和完整性的方法。本文将介绍分布式事务的基本概念、实现方式、在Java中的具体实现以及在实际应用中的案例。 分布式事务的基本概念 分布式事务涉及多个独立的数…...

5、双足机器人mpc动力学模型

为计算机器人的当前实际状态x,需要建立双足质心动力学模型。 速度模型由控制输入变量推导速度公式: x向速度νx :当前机器人x方向的前进速度,初始值由速度传感器实时测量得到。y向速度νy :机器人y方向的平移速度。z向速度νz :垂直方向的速度,对于双足机器人行走时为0:…...

虚拟机配置与windows之间文件夹共享samba服务:

虚拟机配置与windows之间文件夹共享samba服务: #输入安装命令: 第一步: 下载samba cd /etc/ sudo apt-get install samba第二步: 配置用户 sudo smbpasswd -a 虚拟机用户名第三步: 进入配置文件配置共享文件 sudo vim /etc/samba/smb.conf末尾输入以下内容: [s…...

探索音频创作的无限可能——Studio One 5 软件深度解析

Studio One 5 是一款功能强大且备受赞誉的音频制作软件,无论是专业音乐制作人还是业余爱好者,都能在其中找到满足自己需求的强大功能。 对于 Mac 和 Windows 用户来说,Studio One 5 提供了一个直观且友好的操作界面。其简洁明了的布局让用户…...

CSS Flex弹性布局

一、传统布局与flex布局 1、传统布局 2、flex布局 二、flex布局原理 1、布局原理 2、flex布局体验 三、flex布局父项常见属性 1、常见的父项属性 2、flex-direction设置主轴的方向 3、justify-content 设置主轴上的子元素排列方式 4、flex-wrap 设置子元素是否换行 …...

第十六章:基于开源大模型使用huggingface在deepspeed与accelerator下继承源码权重保存而实现resume与infer

文章目录 前言一、huggingface的_save_checkpoint函数不同阶段保存内容介绍1、_save_checkpoint函数2、save_model函数3、_save函数4、save_pretrained函数5、resume说明二、模型训练Resume相关内容重载1、Resume的一次性权重载入(deepspeed_load_checkpoint)2、Resume的optimi…...

ZooKeeper 入门:初学者指南

在分布式系统领域,协调和同步至关重要。Apache ZooKeeper 是一种分布式协调服务,是帮助管理和同步分布式环境中服务的基本组件。本指南旨在深入分析 ZooKeeper、其架构及其在现代分布式系统中的作用。我们还将探索一个示例来展示其实际影响。 ZooKeeper…...

【数据结构(邓俊辉)学习笔记】二叉搜索树04——AVL树

文章目录 1.重平衡1.1 AVL BBST1.2 平衡因子1.3 适度平衡1.4 接口1.5 失衡 复衡 2. 插入2.1 单旋2.2 双旋2.3 实现 3. 删除3.1 单旋3.2 双旋3.3 实现 4. (3 4)-重构4.1 "34"重构4.2 "34"实现4.3 rotateAt4.4 综合评价 1.重平衡 1…...

SpringMVC基础详解

文章目录 一、SpringMVC简介1、什么是MVC2、MVC架构模式与三层模型的区别3、什么是SpringMVC 二、HelloWorld程序1、pom文件2、springmvc.xml3、配置web.xml文件4、html文件5、执行Controller 三、RequestMapping注解1、value属性1.1、基础使用1.2、Ant风格(模糊匹配…...

SQL SERVER 设置端口

要在SQL Server中设置端口&#xff0c;可以通过SQL Server Configuration Manager来完成。以下是详细的步骤&#xff1a; 1. 打开SQL Server Configuration Manager 在Windows中&#xff0c;按 Win R 键打开运行窗口。输入 SQLServerManager<version>.msc 并按回车。例…...

华芯微特2024慕尼黑上海电子展预告

7月8日-7月10日&#xff0c;2024慕尼黑上海电子展在上海新国际博览中心举办。华芯微特展号:E4.4815&#xff0c;诚意邀请各位莅临参观。 公司介绍 华芯微特是一家由留美归国资深技术团队创立的中国芯片设计公司&#xff0c;是国家高新技术企业。2014年进军MCU产业&#xff0c;专…...

DETR End-to-End Object Detection with Transformers

End-to-End Object Detection with Transformers 论文链接&#xff1a;http://arxiv.org/abs/2005.12872 代码地址&#xff1a;https://github.com/facebookresearch/detr 一、摘要 提出了一种将目标检测视为直接集合预测问题的新方法。该方法简化了检测流程&#xff0c;有效…...

【后端面试题】【中间件】【NoSQL】ElasticSearch 节点角色、写入数据过程、Translog和索引与分片

中间件的常考方向&#xff1a; 中间件如何做到高可用和高性能的&#xff1f; 你在实践中怎么做的高可用和高性能的&#xff1f; Elasticsearch节点角色 Elasticsearch的节点可以分为很多种角色&#xff0c;并且一个节点可以扮演多种角色&#xff0c;下面列举几种主要的&…...

【TB作品】玩具电子琴,ATMEGA128单片机,Proteus仿真

题目 7 &#xff1a;玩具电子琴 基于单片机设计一能够发出中音八个音阶的音乐信号的电子琴&#xff0c;能够实现弹奏和音符显示功 能。 具有 8 个音阶按键&#xff0c;每按下一个按键时&#xff0c;所对应的 LED 点亮&#xff0c;音符进行显示。 具体要求如下&#xff1a; &…...

1974Springboot医院远程诊断管理系统idea开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot医院远程诊断管理系统是一套完善的信息系统&#xff0c;结合springboot框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库…...

SQL游标的应用场景及使用方法

SQL游标的应用场景及使用方法 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨SQL中游标的应用场景及使用方法。游标在SQL中是一种重要的数据…...

LLama-Factory使用教程

本文是github项目llama-factory的使用教程 注意&#xff0c;最新的llama-factory的github中训练模型中&#xff0c;涉及到本文中的操作全部使用了.yaml配置。 新的.yaml的方式很简洁但不太直观&#xff0c;本质上是一样的。新的readme中的.yaml文件等于下文中的bash指令 PS: …...

Java面试题:讨论在Java Web应用中实现安全的认证和授权机制,如使用Spring Security

在Java Web应用中&#xff0c;实现安全的认证和授权是至关重要的&#xff0c;Spring Security是一个强大的框架&#xff0c;可以简化这项工作。以下是详细讨论如何在Java Web应用中使用Spring Security实现安全的认证和授权机制。 Spring Security简介 Spring Security是一个…...

如何在Vue3项目中使用Pinia进行状态管理

**第一步&#xff1a;安装Pinia依赖** 要在Vue3项目中使用Pinia进行状态管理&#xff0c;首先需要安装Pinia依赖。可以使用以下npm命令进行安装&#xff1a; bash npm install pinia 或者如果你使用的是yarn&#xff0c;可以使用以下命令&#xff1a; bash yarn add pinia *…...

【初阶数据结构】深入解析队列:探索底层逻辑

&#x1f525;引言 本篇将深入解析队列:探索底层逻辑&#xff0c;理解底层是如何实现并了解该接口实现的优缺点&#xff0c;以便于我们在编写程序灵活地使用该数据结构。 &#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...

Android写一个捕获全局异常的工具类

项目开发和实际运行过程中难免会遇到异常发生&#xff0c;系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler&#xff0c;它是Thread的子类&#xff08;就是package java.lang;里线程的Thread&#xff09;。本文将利用它将设备信息、报错信息以及错误的发生时间都…...

Unity VR/MR开发-VR开发与传统3D开发的差异

视频讲解链接&#xff1a;【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...

一些实用的chrome扩展0x01

简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序&#xff0c;无论是测试应用程序、搜寻漏洞还是收集情报&#xff0c;它们都能提升工作流程。 FoxyProxy 代理管理工具&#xff0c;此扩展简化了使用代理&#xff08;如 Burp…...