分布式事务学习笔记(一)分布式事务问题、CAP定理、BASE理论、Seata

文章目录

1 分布式事务问题

1.1 本地事务

本地事务,也就是传统的单机事务,它必须要满足以下四个原则:

1.2 分布式事务

分布式事务,就是指不是在单个服务或单个数据库架构下产生的事务。例如:

在数据库水平拆分、服务垂直拆分之后,一个业务操作通常要跨多个数据库、服务才能完成。

例如电商行业中比较常见的下单付款案例,就包括创建新订单、扣减商品库存、从用户账户余额扣除金额等几个行为,而这些行为需要访问三个不同的微服务和三个不同的数据库:

创建新订单、扣减商品库存、从用户账户余额扣除金额在每一个服务和数据库内都是一个本地事务,可以保证ACID原则。

把这三个行为看做一个"业务",保证“业务”的原子性,要么所有操作全部成功,要么全部失败,不允许出现部分成功部分失败的现象,这就是分布式系统下的事务

此时ACID难以满足,这是分布式事务要解决的问题。

1.3 创建分布式事务演示案例

  • 1)创建数据库,名为jingd,然后分别创建用户表t_account、订单表t_order、库存表t_storage
-- 创建数据库
create database jingd;
use jingd;
-- 创建用户表
CREATE TABLE `t_account`  (`id` int(11) NOT NULL AUTO_INCREMENT,`user_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`money` int(11) UNSIGNED NULL DEFAULT 0,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = COMPACT;
-- 用户ID为 user202103032042012 的用户余额为 1000 
INSERT INTO `t_account` VALUES (1, 'user202103032042012', 1000);
-- 创建订单表
CREATE TABLE `t_order`  (`id` int(11) NOT NULL AUTO_INCREMENT,`user_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`commodity_code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`count` int(11) NULL DEFAULT 0,`money` int(11) NULL DEFAULT 0,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = COMPACT;
-- 创建库存表
CREATE TABLE `t_storage`  (`id` int(11) NOT NULL AUTO_INCREMENT,`commodity_code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`count` int(11) UNSIGNED NULL DEFAULT 0,PRIMARY KEY (`id`) USING BTREE,UNIQUE INDEX `commodity_code`(`commodity_code`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = COMPACT;
-- 商品编号为 100202003032041 的商品库存有 10 件
INSERT INTO `t_storage` VALUES (1, '100202003032041', 10);
  • 2)创建微服务的结构如下

  • jingd-demo:父工程,负责管理项目依赖。
  • jd-account-service:账户服务,负责管理用户的资金,提供扣减余额的接口。
  • jd-storage-service:库存服务,负责管理商品库存,提供扣减库存的接口。
  • jd-order-service:订单服务,负责管理订单,提供创建订单的接口。

需要特别注意的是,jd-order-service订单服务创建订单时,需要通过Feign调用account-servicestorage-service服务的接口:

启动后,三个微服务均注册到nacos中:

并提供了相对应的接口:

  • 3)测试创建订单

初始化数据库后,商品编号为100202003032041的商品库存有10件,用户ID为user202103032042012的用户余额为1000。

调用创建订单接口,假设该用户买了15件商品,共花费500元:

查看日志可以发现,由于库存不足,创建订单失败了:

但扣减余额却成功了:

这就违背了“创建订单”业务的原子性,出现了分布式业务问题。

2 理论基础

2.1 CAP定理

1998年,加州大学的计算机科学家 Eric Brewer 提出,分布式系统有三个指标:

  • Consistency(一致性)
  • Availability(可用性)
  • Partition tolerance (分区容错性)

Eric Brewer 认为,这三个指标不可能同时做到,这个结论就叫做 CAP 定理。

  • CAP指标的矛盾

一致性是指,用户访问分布式系统中的任意节点,得到的数据必须一致的。

例如jd-account-service账户服务包含两个节点account-01account-02,它们的初始数据是一致的。

当创建订单时,可能修改了account-01节点的数据,此时两个节点的数据就产生了差异。而要想保住一致性,就必须实现account-01节点到account-02节点的数据同步

可用性是指,用户访问集群中的任意健康节点,必须能得到响应,而不是超时或拒绝。

而分区容错是指,由于网络故障或其它原因导致的分布式系统部分节点与其它节点失去连接时,系统可以形成独立分区对这些故障节点进行隔离,使整个系统仍然可以持续对外提供服务。

  • 如果此时要保证数据一致性,就必须等待网络恢复,完成数据同步后,整个集群才对外提供服务。但这段时间里,服务处于阻塞状态,可用性受到影响。

  • 如果此时要保证服务可用性,就不能等待网络恢复,那不同节点之间就会出现数据不一致,一致性受到影响。

  • 也就是说,在P一定会出现的情况下,A和C之间只能实现一个。

2.2 BASE理论

BASE理论是对CAP的一种解决思路,包含三个思想:

  • Basically Available (基本可用)分布式系统在出现故障时,允许损失部分可用性,即保证核心可用。
  • Soft State(软状态):在一定时间内,允许出现中间状态,比如临时的不一致状态。
  • Eventually Consistent(最终一致性):虽然无法保证强一致性,但是在软状态结束后,最终达到数据一致。

2.3 解决分布式事务的思路

分布式事务最大的问题是各个子事务的一致性问题,因此借鉴CAP定理和BASE理论,有两种解决思路:

  • AP模式:各子事务分别执行和提交,允许出现结果不一致,然后采用弥补措施恢复数据即可,实现最终一致。
  • CP模式:各个子事务执行后互相等待,同时提交,同时回滚,达成强一致。但事务等待过程中,处于弱可用状态。

但不管是哪一种模式,都需要在子系统事务之间互相通讯,协调事务状态,也就是需要一个事务协调者(TC)

Seata_159">2.4 Seata

Seata是2019年1月份蚂蚁金服和阿里巴巴共同开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务,为用户打造一站式的分布式解决方案。

它在分布式系统中有三个重要的角色:

  • TC (Transaction Coordinator) - 事务协调者
  • TM (Transaction Manager) - 事务管理器
  • RM (Resource Manager) - 资源管理器

本节完,更多内容请查阅分类专栏:微服务学习笔记

感兴趣的读者还可以查阅我的另外几个专栏:

  • SpringBoot源码解读与原理分析
  • MyBatis3源码深度解析
  • Redis从入门到精通
  • MyBatisPlus详解
  • SpringCloud学习笔记

http://www.ppmy.cn/server/116439.html

相关文章

【学习笔记】 陈强-机器学习-Python-Ch14 支持向量机

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-…

Python | Leetcode Python题解之第399题除法求值

题目: 题解: class Solution:def calcEquation(self, equations: List[List[str]], values: List[float], queries: List[List[str]]) -> List[float]:# 构造图graph defaultdict(list)for (u, v), value in zip(equations, values):graph[u].appen…

WebGL系列教程六(纹理映射与立方体贴图)

目录 1 前言2 思考题3 纹理映射介绍4 怎么映射?5 开始绘制5.1 声明顶点着色器和片元着色器5.2 修改顶点的颜色为纹理坐标5.3 指定顶点位置和纹理坐标的值5.4 获取图片成功后进行绘制5.5 效果5.6 完整代码 6 总结 1 前言 上一讲我们讲了如何使用索引绘制彩色立方体&a…

Zabbix监控自动化

监控在运维工作中所占的比例为 30%左右,监控做得好,会省很多事,让工作能有序地进行。理想的监控应该是自动化的,只需要配置规则,即可自动完成所有的事情,比如主机的自动添加和注册、模板的自动添加、分组的…

学习Vue3的第五天

目录 API对比 shallowRef 与 shallowReactive 对比总结 使用场景 总结 readonly 与 shallowReadonly 对比总结 使用场景 总结 toRaw 与 markRaw 对比总结 使用场景 总结 customRef 应用场景 总结 示例:异步数据获取 Vue3新组件 Teleport Suspen…

AIPaperGPT写论文靠谱吗?

AIPaperGPT,论文写作神器~ https://www.aipapergpt.com/ 在信息爆炸的今天,学术写作的挑战日益增加,而AIPaperGPT作为一款旨在提升写作效率的工具,其可靠性自然成为了用户关注的焦点。本文将从多个维度对AIPaperGPT进行全面评估&…

AI prompt(提示词)

# 好用的用于学习的AI提示词 ## 费曼学习法 请使用费曼学习法,用简单的语言解释(量子力学)是什么,并提供一个简单的例子来说明它如何应用 ## 帕累托法则(80/20原则) 将(量子力学)最…

网络运维管理:确保企业网络系统稳定运行之道

在当今数字化时代,企业网络系统的稳定运行和高效管理是企业业务持续发展和创新的关键。网络运维管理的核心目标正是确保网络设备和服务的高可用性、优化网络性能、保护网络安全、快速解决网络故障以及有效管理网络配置。本文将深入探讨网络运维管理系统的关键组件、…

接口测试原理及Postman详解

接口测试定义 接口是前后端沟通的桥梁,是数据传输的通道,包括外部接口、内部接口。内部接口又包括:上层服 务与下层服务接口,同级接口 生活中常见接口:电脑上的键盘、USB接口,电梯按钮,KFC下单 接口测试…

计算机毕业设计选题推荐-农家乐综合服务系统-乡村游乐购系统-田园休闲生活系统-Java/Python项目实战

✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

Qt 界面设计布局编辑

第1 部分 Qt 基础 (2) 双击dialog.ui 文件,打开Qt 的设计器,中间的空白视窗为一个Parent Widget, 需要建立一些Child Widget 。在左边的工具箱中找到所需要的Widget: 拖曳出一个Label、一个Line Edit(用于输入文字)、一个Horizo…

Redis进阶(六):缓存

1.缓存 速度快的设备可以作为速度慢的设备的缓存 缓存能够有意义:二八定律,20%的数据可以应对80%的请求 通常使用redis作为数据库的缓存(mysql) 数据库是非常重要的组件,mysql速度比较慢 因为mysql等数据库&#x…

【C++多线程编程】 线程安全与对象生命周期管理

目录 类的线程安全 实现线程安全 构造函数在多线程中的安全性 析构函数多线程环境的安全 智能指针实现多线程安全 shared_ptr 非完全线程安全 shared_ptr可能导致对象生命周期延长 const引用可以减少传递shared_ptr开销 shared_ptr 智能指针块模块的优点 析构所在线程…

用AI的智慧,传递感恩之心——GPT-4o助力教师节祝福

随着科技的飞速发展,人工智能在我们生活中的应用日益广泛。在这个教师节,不仅可以用传统的方式表达对老师的感恩之情,还可以借助OpenAI最新推出的GPT-4o模型,生成独特而温暖的祝福语和精美海报,让我们的感恩显得更加与…

How to implement custom environment in keras-rl / OpenAI GYM?

题意:如何在 Keras-RL / OpenAI GYM 中实现自定义环境? 问题背景: Im a complete newbie to Reinforcement Learning and have been searching for a framework/module to easily navigate this treacherous terrain. In my search Ive come…

动态规划:汉诺塔问题|循环汉诺塔

目录 1. 汉诺塔游戏简介 2.算法原理 3.循环汉诺塔 1. 汉诺塔游戏简介 汉诺塔游戏是一个经典的数学智力游戏,其目标是将塔上不同大小的圆盘全部移动到另一个塔上,且在移动过程中必须遵守以下规则: 每次只能移动一个圆盘较大的圆盘不能放在…

音视频入门基础:AAC专题(1)——AAC官方文档下载

一、AAC简介 高级音频编码(英语:Advanced Audio Coding,AAC)是有损音频压缩的专利数字音频编码标准,由Fraunhofer IIS、杜比实验室、贝尔实验室、Sony、Nokia等公司共同开发。出现于1997年,为一种基于MPEG…

基于SpringBoot+Vue+MySQL的滑雪场管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 在快速发展的冰雪运动热潮下,为了提升滑雪场的管理效率与顾客体验,我们设计并实现了一套基于SpringBoot后端框架、Vue前端框架以及MySQL数据库的滑雪场管理系统。该系统旨在通过数字化手段,优…

MySQL MHA

mysql架构 1、一主一从 2、主主复制(M-M双主互备)(两个主互为主从)(用得少) 可能导致数据隔离性,两边同时修改数据时可能导致数据不一致 2.1 M-M-M 3、一主多从(访问量大&#…

【Leetcode:257. 二叉树的所有路径 + 二叉树 + 递归 】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…