谷粒商城实战笔记-284-商城业务-分布式事务-本地事务隔离级别传播行为等复习

本文主要是介绍谷粒商城实战笔记-284-商城业务-分布式事务-本地事务隔离级别传播行为等复习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

      • 一,ACID原则
        • 1. 原子性 (Atomicity)
        • 2. 一致性 (Consistency)
        • 3. 隔离性 (Isolation)
        • 4. 持久性 (Durability)
      • 二,隔离级别
        • 1,简介
        • 2,举例说明
          • 2.1 读未提交 (Read Uncommitted)
          • 2.2 读已提交 (Read Committed)
          • 2.3 可重复读 (Repeatable Read)
          • 2.4 序列化 (Serializable)
      • 三,事务的传播性

在数据库系统中,事务是保证数据一致性的关键机制之一。

事务处理遵循ACID原则,并且有不同的隔离级别来防止并发事务间的数据冲突。

此外,事务的传播性是指在多层调用中如何继承事务的行为。

一,ACID原则

ACID是Atomicity(原子性)、Consistency(一致性)、Isolation(隔离性)和Durability(持久性)的缩写,这是事务处理的基本原则。

  1. 原子性(Atomicity)

    • 事务中的所有操作要么全部完成,要么全部不完成。如果事务的一部分成功而另一部分失败,则整个事务被视为失败,并且之前成功的部分也将被回滚。
  2. 一致性(Consistency)

    • 事务开始前和结束后,数据库都必须处于一致性状态。这意味着事务不能破坏任何规则,如外键约束、唯一性约束等。
  3. 隔离性(Isolation)

    • 多个并发执行的事务之间相互隔离,不会看到彼此未提交的结果。这是通过不同的隔离级别来实现的。
  4. 持久性(Durability)

    • 一旦事务提交,其结果将是永久的,即使系统发生崩溃也不会丢失已提交的数据。
1. 原子性 (Atomicity)

场景描述

  • Alice 的账户余额为 $500。
  • Bob 的账户余额为 $300。
  • Alice 想要向 Bob 转账 $100。

原子性要求

  • 如果转账成功,Alice 的账户余额应减少 $100,Bob 的账户余额应增加 $100。
  • 如果转账过程中发生任何错误,如系统崩溃或网络中断,那么两个账户的余额都不应该改变。

示例说明

  • 开始事务。
  • 从 Alice 的账户中扣除 $100。
  • 将 $100 加到 Bob 的账户中。
  • 提交事务。

结果

  • 如果事务成功提交,则 Alice 的余额变为 $400,Bob 的余额变为 $400。
  • 如果事务过程中发生错误,如网络中断,则两个账户的余额保持不变,即 Alice 的余额仍为 $500,Bob 的余额仍为 $300。
2. 一致性 (Consistency)

场景描述

  • Alice 的账户余额为 $500。
  • Bob 的账户余额为 $300。
  • Alice 想要向 Bob 转账 $100。

一致性要求

  • 转账前后的账户总金额不变。
  • 转账完成后,账户余额必须满足所有业务规则,如最低余额限制。

示例说明

  • 确保转账前 Alice 的账户余额大于等于 $100。
  • 转账过程中,确保 Alice 和 Bob 的账户余额符合业务规则。
  • 转账完成后,Alice 的账户余额为 $400,Bob 的账户余额为 $400,总金额仍为 $800。

结果

  • 如果转账过程中发现 Alice 的账户余额不足,则事务回滚,保持一致性。
  • 如果转账成功,则确保 Alice 和 Bob 的账户余额均符合规则。
3. 隔离性 (Isolation)

场景描述

  • Alice 和 Bob 的账户余额分别为 $500 和 $300。
  • 另一个事务尝试从 Bob 的账户中提取 $200。
  • 同时,Alice 正在向 Bob 转账 $100。

隔离性要求

  • Alice 的转账事务和 Bob 的提现事务应该互相隔离,不能看到对方未提交的变更。
  • 即使两个事务并发执行,结果也应该如同它们串行执行一样。

示例说明

  • Alice 开始事务,尝试从自己的账户中扣除 $100 并增加 Bob 的账户余额。
  • Bob 开始事务,尝试从自己的账户中提取 $200。
  • Alice 的事务提交。
  • Bob 的事务尝试提交时,发现自己的账户余额不足以提取 $200,因此回滚。

结果

  • Alice 的账户余额变为 $400。
  • Bob 的账户余额保持 $300 不变,因为 Bob 的事务未能提交。
  • 即使两个事务并发执行,Bob 的账户余额也不会被错误地减少。
4. 持久性 (Durability)

场景描述

  • Alice 的账户余额为 $500。
  • Bob 的账户余额为 $300。
  • Alice 想要向 Bob 转账 $100。

持久性要求

  • 一旦事务提交,对数据库的更改就是永久的。
  • 即使系统发生故障,如停电或重启,更改也应保持不变。

示例说明

  • Alice 开始事务,尝试从自己的账户中扣除 $100 并增加 Bob 的账户余额。
  • Alice 的事务提交。
  • 系统突然重启。

结果

  • 即使系统重启,Alice 的账户余额仍为 $400,Bob 的账户余额为 $400。
  • 数据库恢复后,Alice 和 Bob 的账户余额保持事务提交时的状态。

二,隔离级别

1,简介

为了实现事务的隔离性,数据库支持不同的隔离级别,以控制事务之间可能产生的并发副作用。

  1. 读未提交(Read Uncommitted)

    • 最低的隔离级别,允许事务读取其他事务尚未提交的数据,可能导致脏读、不可重复读和幻读。
  2. 读已提交(Read Committed)

    • 事务只能读取其他事务已提交的数据,避免了脏读,但仍可能发生不可重复读和幻读。
  3. 可重复读(Repeatable Read)

    • 在同一个事务内多次读取同一行数据时,结果是相同的,即使在这期间有其他事务更新了该行数据。这避免了不可重复读,但仍然可能发生幻读。
  4. 序列化(Serializable)

    • 最高的隔离级别,完全消除了并发事务带来的问题,但可能会导致性能下降,因为事务可能需要等待其他事务完成才能执行。
2,举例说明

为了更好地理解不同的隔离级别,使用一个简单的银行转账场景作为例子。

假设有两个账户:Alice 和 Bob。Alice 想要向 Bob 转账 $100。

通过四个不同的隔离级别来展示它们是如何影响并发事务处理的:

  1. 读未提交 (Read Uncommitted)
  2. 读已提交 (Read Committed)
  3. 可重复读 (Repeatable Read)
  4. 序列化 (Serializable)

场景描述:

  • 初始状态下,Alice 的账户余额为 $500。
  • 初始状态下,Bob 的账户余额为 $300。
  • Alice 想要向 Bob 转账 $100。
2.1 读未提交 (Read Uncommitted)

隔离级别:读未提交是最弱的隔离级别,它允许事务读取其他事务尚未提交的数据。

示例说明

  • 事务 T1 开始,尝试从 Alice 的账户中扣除 $100 并增加 Bob 的账户余额。
  • 事务 T2 开始,读取 Bob 的账户余额,此时 Bob 的余额仍然是 $300(T1 还没有提交)。
  • 事务 T1 完成,将 $100 加入 Bob 的账户并提交。
  • 事务 T2 再次读取 Bob 的账户余额,此时 Bob 的余额已经是 $400。

结果

  • T2 两次读取 Bob 的账户余额得到不同的结果,这称为不可重复读
  • T2 在 T1 提交之前读取了 Bob 的账户余额,这称为脏读
2.2 读已提交 (Read Committed)

隔离级别:读已提交禁止了脏读,但仍然允许不可重复读。

示例说明

  • 事务 T1 开始,尝试从 Alice 的账户中扣除 $100 并增加 Bob 的账户余额。
  • 事务 T2 开始,读取 Bob 的账户余额,此时 Bob 的余额为 $300(T1 还没有提交)。
  • 事务 T1 完成,将 $100 加入 Bob 的账户并提交。
  • 事务 T2 再次读取 Bob 的账户余额,此时 Bob 的余额已经是 $400。

结果

  • T2 第一次读取 Bob 的账户余额为 $300,第二次为 $400,这同样是不可重复读。
  • 但是,T2 只读取了已经提交的数据,所以没有脏读。
2.3 可重复读 (Repeatable Read)

隔离级别:可重复读禁止了脏读和不可重复读,但仍然允许幻读

示例说明

  • 事务 T1 开始,尝试从 Alice 的账户中扣除 $100 并增加 Bob 的账户余额。
  • 事务 T2 开始,在事务 T1 提交之前读取 Bob 的账户余额,此时 Bob 的余额为 $300。
  • 事务 T1 完成,将 $100 加入 Bob 的账户并提交。
  • 事务 T2 再次读取 Bob 的账户余额,此时 Bob 的余额仍然是 $300(由于可重复读特性)。

结果

  • T2 两次读取 Bob 的账户余额都是 $300,没有不可重复读。
  • T2 读取的是事务 T1 提交之前的数据,所以没有脏读。
2.4 序列化 (Serializable)

隔离级别:序列化是最强的隔离级别,它完全消除了脏读、不可重复读和幻读。

示例说明

  • 事务 T1 开始,尝试从 Alice 的账户中扣除 $100 并增加 Bob 的账户余额。
  • 事务 T2 开始,尝试读取 Bob 的账户余额,但由于 T1 正在进行,T2 必须等待 T1 提交。
  • 事务 T1 完成,将 $100 加入 Bob 的账户并提交。
  • 事务 T2 继续,读取 Bob 的账户余额,此时 Bob 的余额为 $400。

结果

  • T2 读取的数据与 T1 提交之后的数据一致,没有脏读、不可重复读和幻读。
  • T2 必须等待 T1 完成,这可能会导致性能降低。

三,事务的传播性

事务的传播性是指在一个事务方法中调用另一个事务方法时,如何处理事务边界的问题。Spring框架中定义了几种传播行为:

  1. REQUIRED

    • 如果当前存在事务,则加入该事务;如果当前不存在事务,则创建一个新的事务。
  2. SUPPORTS

    • 如果当前存在事务,则加入该事务;如果当前不存在事务,则以非事务方式执行。
  3. MANDATORY

    • 如果当前存在事务,则加入该事务;如果当前不存在事务,则抛出异常。
  4. REQUIRES_NEW

    • 创建一个新的事务,如果当前存在事务,则挂起当前事务。
  5. NOT_SUPPORTED

    • 以非事务方式执行操作,并挂起当前事务(如果有)。
  6. NEVER

    • 以非事务方式执行,如果当前存在事务,则抛出异常。
  7. NESTED

    • 如果当前存在事务,则在嵌套事务内执行;如果当前不存在事务,则行为类似于REQUIRED

通过这些传播行为,可以灵活地控制多层调用中的事务行为,确保事务正确地传播和管理。

这篇关于谷粒商城实战笔记-284-商城业务-分布式事务-本地事务隔离级别传播行为等复习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1118967

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

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

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

滚雪球学Java(87):Java事务处理:JDBC的ACID属性与实战技巧!真有两下子!

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~ 🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!! 环境说明:Windows 10

业务协同平台--简介

一、使用场景         1.多个系统统一在业务协同平台定义协同策略,由业务协同平台代替人工完成一系列的单据录入         2.同时业务协同平台将执行任务推送给pda、pad等执行终端,通知各人员、设备进行作业执行         3.作业过程中,可设置完成时间预警、作业节点通知,时刻了解作业进程         4.做完再给你做过程分析,给出优化建议         就问你这一套下

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2