数据库系统概论:事务与并发一致性问题

news2024/9/20 8:51:27

随着网络应用的普及,数据库并发问题变得越来越重要。数据库并发指的是多个用户或进程同时访问和操作数据库的能力。它是数据库系统性能优化的重要方面,旨在提高系统的吞吐量和响应时间,以满足多用户同时访问数据库的需求。然而,这种能力也带来了数据一致性隔离性性能等方面的挑战。

事务

事务(Transaction)是指一系列数据库操作组成的逻辑单元,是并发控制的基本单位。事务具有(ACID特性)原子性一致性隔离性持久性等属性,是保证数据一致性和事务并发控制的重要手段。

![[事务]]

在关系数据库中,一个事务可以是一条 SQL 语句、一组 SQL 语句或整个程序。事务和程序是两个概念。一般地讲,一个程序中包含多个事务。事务的开始与结束可以由用户显式控制。如果用户没有显式地定义事务,则由数据库管理系统按默认规定自动划分事务。

ACID

ACID 是指数据库事务的四个特性:

  • 原子性 (Atomicity)
  • 一致性 (Consistency)
  • 隔离性 (Isolation)
  • 持久性 (Durability)。

这些特性保证了在事务中,所有操作要么全部成功提交(COMMIT),要么全部撤销回滚(ROLLBACK),不允许只部分执行,并且数据库始终处于一致性状态,即使系统故障或者其他异常情况也不会破坏数据的完整性

  • 原子性 (Atomicity):确保了事务中的所有操作不可分割,要么全部提交成功,要么全部失败回滚。

    回滚可以用日志来实现,日志记录着事务所执行的修改操作,在回滚时反向执行这些修改操作即可

  • 一致性 (Consistency):表示事务必须把数据库从一个一致状态转变为另一个一致状态。在一致性状态下,所有事务对一个数据的读取结果都是相同的。

    • 当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。

    • 如果数据库系统运行中发生故障,有些事务尚未完成就被迫中断,这些未完成的事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态(不一致的状态)。

  • 隔离性 (Isolation):确保了多个事务并发执行时不会相互干扰,即一个事务所做的修改在最终提交前,对其他事务是不可见的。

    如果一项操作无法完成或出现了意外故障,整个事务就会失败,并且所有对数据库所做的修改都会被回滚。

  • 持久性 (Durability):是指一旦事务提交,其执行的结果就会持久保存到数据库中,不会因系统故障、崩溃或其他错误导致执行数据丢失。

    可以通过数据库备份和恢复来实现,在系统发生崩溃时,使用备份的数据库进行数据恢复。

要保证事务的正确性和数据的一致性,需要在编写数据库操作时遵循一些基本的事务处理原则,例如保证事务的独立性、粒度合理、尽量减少锁竞争等。

事务特性的关系

ACID 的四个特性是相互关联和互相依赖的

  • 只有满足一致性,事务的执行结果才是正确的。

  • 在无并发的情况下,事务串行执行,隔离性一定能够满足。此时只要能满足原子性,就一定能满足一致性。

  • 在并发的情况下,多个事务并行执行,事务不仅要满足原子性,还需要满足隔离性,才能满足一致性。

  • 事务满足持久化是为了能应对数据库崩溃的情况。

![[Pasted image 20231214163656.png]]

事务运行方式

事务的运行方式主要分为两种方式:

  • 串行每个时刻只有一个事务运行

    串行的优点是实现简单,容易保证事务的一致性;但缺点是效率低。

  • 并行同一时刻可以有多个事务同时运行

    并行的优点是效率高,可提高整个系统的吞吐量,减少平均响应时间;但缺点是会导致数据库的不一致性。

在单处理系统中,所谓的并行实际上是宏观上的并行运行,微观上的串行运行,即交叉并发

允许多个用户同时使用同一个数据库的数据库系统称为多用户数据库系统,在这种系统中,同一时刻并发运行的事务数量相当庞大。

假设有两个事务 S S S T T T,其中 S S S m m m 条指令, T T T n n n 条指令,且每个事务内部指令的相对顺序不能错乱,那么可能的执行顺序有 R R R 种: R = C m + n m = C m m + n = ( m + n ) ! m ! n ! R=C^m_{m+n} = C^{m+n}_m=\frac{(m+n)!}{m!n!} R=Cm+nm=Cmm+n=m!n!(m+n)!

调度

调度事务的一次执行顺序称为一个调度,表示事务的指令在系统中执行的时间顺序,一组事务的调度必须保证:包含了所有事务的操作指令、一个事务中指令的顺序必须保持不变。

调度又分为串行调度和并行调度:

  • 串行调度:属于同一事务的指令紧挨在一起执行,对于有 n n n 个事务的事务组,可以有 n ! n! n! 个有效调度

  • 并发调度:来自不同事务的指令可以交叉执行。并发调度有可能会导致错误结果,仅当并发调度等价于某个串行调度时,则称该并发调度时可串行化的、正确的。

并发一致性问题

在并发环境下,可能会出现并发一致性问题,并发一致性问题是指在数据库或分布式系统中,当多个事务或操作并发执行时,由于事务的隔离性难以完全保证,导致数据的一致性和完整性受到破坏的现象

这些问题主要包括 脏读不可重复读幻读 以及 丢失修改 等,可能导致数据库中的数据变得不一致。

读脏数据

脏读(Dirty Read):通常情况下,读取数据的事务会等待修改数据的事务提交,以便确保数据的一致性。一个事务读取了另一个未提交的事务所做的修改,然后在另一个事务回滚时,读取的数据就变得无效、不一致。脏读可能导致不可靠的数据和错误的决策。

![[Pasted image 20231214164440.png]]

脏读可能导致严重的问题,它可能会使应用程序基于错误的数据做出错误的决策。例如,如果一个银行应用程序在脏数据的情况下对银行帐户余额进行计算,则可能会导致银行资金的混乱。

不可重复读

不可重复读(Non-repeatable Read):一个事务在同一查询中多次读取同一行数据时,得到的结果不一致。在同一个事务,读取的过程中,由于其他事务修改了数据,同一查询可能返回不同的结果。

![[Pasted image 20231214164728.png]]

情况实例:

  1. 事务 A 开始并执行 SELECT 语句,读取了某一行的数据。

  2. 事务 B 修改了该行数据,并提交事务。

  3. 事务 A 再次执行相同的 SELECT 语句,读取同一行数据,但是此时得到的结果与之前读取的结果不一致。

不可重复读可能对应用程序逻辑造成困扰,可能导致数据的不一致,特别是对于需要多次读取数据并进行比较或计算的场景。

例如,一个订单系统中,一个事务读取了某个订单的金额,在执行过程中,另一个事务对订单金额进行了修改,导致两次读取的金额不一致,进而影响了订单的计算结果。

幻读

幻读(Phantom Read):在同一个事务中,同一查询多次执行,得到的结果集不一致。这是因为在读取的过程中,其他事务插入或删除了符合查询条件的数据。导致再次执行同一查询时出现新的数据行或少了一些数据行。

可以理解为,幻读 是一种比 不可重复读 更严重的数据不一致情况。

![[Pasted image 20231214165024.png]]

  1. 事务A 开始并执行 SELECT 语句,读取了表中的某几行数据。

  2. 事务B 插入了符合查询条件的一行数据,并提交事务。

  3. 事务A 再次执行相同的 SELECT 语句,读取相同的几行数据,但是此时得到的结果集中出现了新的一行数据,事务A 读取到的就是脏数据。

幻读可能导致数据的不完整。在高并发环境下,串行化隔离级别可能导致性能问题。因此,需要根据具体的业务需求和性能考量选择合适的隔离级别,以避免幻读的问题。

与不可重复读相比,幻读主要是针对批量数据的插入和删除操作,不仅会导致对数据的读取不一致,还可以对其它业务操作造成一定的困扰。

例如,在一个网上商城系统中,一个事务读取某一类商品的所有库存,使用返回的结果更新了前端页面的销售数量,此时,客户来了几个下单,由不同的事务进行插入操作,导致前端页面展示的库存数量不一致,进而影响了用户体验和商城的信誉。

丢失更新

丢失更新(Lost Update):由于并发事务的执行,两个事务同时对相同的数据执行更新操作,但是其中一个事务的更新结果被另一个事务覆盖,从而丢失了其中一个事务的更新。这可能导致数据的丢失和覆盖。

![[Pasted image 20231214165442.png]]

当多个事务同时对同一数据进行修改时,如果不采取适当的并发控制措施,就可能导致丢失更新的问题:

  1. 事务A 读取一行数据,并将其存储在本地缓存中。

  2. 事务B 读取同一行数据,也将其存储在本地缓存中。

  3. 事务A 修改了该行数据,并将其更新到数据库中。

  4. 事务B 修改相同行数据,此时使用的是之前读取到的旧值,然后将其更新到数据库中。

  5. 结果是事务B 的修改覆盖了事务A 的修改,事务A的更新操作被丢失。

这种情况下,事务B 覆盖了事务A 的更新,最终导致数据的一致性问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1937229.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GPT-4o模型开通使用教学,解除使用限制【Outlook版】

OpenAI的GPT-4o模型免费用户都可以使用,但是遗憾的是每三小时可以使用十次问答。 但是还是有好多同学连使用都不会,今天这篇文章教会你如何使用并解除使用限制。 大家可以使用Outlook邮箱。 打开outlook官网选择中间获得免费账户。 ​ 在接下来的邮…

AGI 之 【Hugging Face】 的【零样本和少样本学习】之一 [构建标记任务] / [ 基线模型 ] 的简单整理

AGI 之 【Hugging Face】 的【零样本和少样本学习】之一 [构建标记任务] / [ 基线模型 ] 的简单整理 目录 AGI 之 【Hugging Face】 的【零样本和少样本学习】之一 [构建标记任务] / [ 基线模型 ] 的简单整理 一、简单介绍 二、零样本学习 (Zero-shot Learning) 和少样本学习…

【Qt】常用控件

文章目录 QWidgetenabledgeometrywindow framewindowTitlewindowIconqrc资源管理windowOpacitycursorfonttoolTipfocusPolicystyleSheet 按钮类PushButtonRadioButtonCheckBoxSignals 显示类LabelLCDNumberProgressBarCalendar 输入类LineEditTextEditComboBoxSpinBoxDateTimeE…

55 、mysql的存储引擎、备份恢复以及日志备份、恢复

一、数据库的存储引擎: 1.1、存储引擎的概念 概念:存储引擎,就是一种数据库存储数据的机制,索引的机制,索引的技巧,锁定水平。 存储的方式和存储的格式。 存储引擎也属于mysql当中的组件,实…

Python游戏开发之制作捕鱼达人游戏-附源码

制作一个简单的“捕鱼达人”游戏可以使用Python结合图形界面库,比如Pygame。Pygame是一个流行的Python库,用于创建视频游戏,它提供了图形、声音等多媒体的支持。以下是一个基础的“捕鱼达人”游戏框架,包括玩家控制一个炮台来射击…

小程序博客搭建分享,纯微信小程序原生实现

本项目代码已开源,具体见: 前端工程:vue3-ts-blog-frontend 后端工程:express-blog-backend 小程序源码:blog-weapp 数据库初始化脚本:关注公众号程序员白彬,回复关键字“博客数据库脚本”&…

【ML练习】决策树

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 一、决策树算法概述 二、代码实现 代码目标:我们希望通过鸢尾花数据,训练一个决策树模型,之后应用该模型,可以…

新的铸造厂通过 PROFIBUS 技术实现完全自动化

钢铁生产商某钢以其在厚钢板类别中极高的产品质量而闻名。其原材料(板坯连铸机)在钢铁厂本地生产,该厂最近新建了一座垂直连铸厂。该项目的一个主要目标是从一开始就完全自动化这座新工厂和整个铸造过程,以高成本效率实现最佳产品…

ue5 使用动画蒙太奇,混合上半身持枪姿势

ue5 使用动画蒙太奇 1.创建动画蒙太奇 添加上半身插槽,在添加持枪动画 搜索equip stand,t,添加进上半身插槽 2.设置动画蓝图 3.播放动画蒙太奇

AFAC2024-基于保险条款的问答 比赛日记 llamafactory qwen npu 910B1

AFAC2024: 基于保险条款的问答挑战——我的实战日记 概述 在最近的AFAC2024竞赛中,我参与了基于保险条款的问答赛道。这是一次深度学习与自然语言处理的实战演练,旨在提升模型在复杂保险文本理解与问答生成方面的能力。本文将分享我的参赛过程&#xf…

C语言 #字符指针

文章目录 前言 一、指针概念简述 二、字符指针 二、字符在内存中的存储 总结 前言 以例子为导向来分析字符指针的中存的是什么,以及常量字符串在内存中是如何存储的。 一、指针概念简述 想要详细地了解指针的概念可以戳此链接(详细的万字讲解&#xff…

机器学习基础入门(1)

最近也在努力的想要学习些机器学习的知识,目前正在了解各个概念及术语,下面就把学习到的概念都列出来。 人工智能 (AI) Artificial intelligence 人工智能生成内容(AIGC) 机器学习(ML) Machine Learning …

《汇编语言 基于x86处理器》- 读书笔记 - Visual Studio 2019 配置 MASM环境

安装 Visual Studio 2019 配置 MASM环境 下载 Visual Studio Installer安装 Visual Studio 20191. 双击运行2. 自定义安装内容3. 修改 MSVC 工具集版本4. 设置主题(可选)5. 安装代码高亮插件 AsmDude(可选)6. 通义灵码&#xff08…

【AI学习】关于Scaling Law的相关学习

一、苦涩的教训 首先,学习一段重要话语: The biggest lesson that can be read from 70 years of AI research is that general methods that leverage computation are ultimately the most effective, and by a large margin. 从70年的人工智能研究中…

服务器借助笔记本热点WIFI上网

一、同一局域网环境 1、当前环境,已有交换机组网环境,服务器已配置IP信息。 设备ip服务器125.10.100.12交换机125.10.100.0/24笔记本125.10.100.39 2、拓扑图 #mermaid-svg-D4moqMym9i0eeRBm {font-family:"trebuchet ms",verdana,arial,sa…

FastAPI(六十五)实战开发《在线课程学习系统》基础架构的搭建

在之前三篇,我们分享的就是需求的分析,基本接口的整理,数据库链接的配置。这次我们分享项目的基本框架,目录结构大致如下: common目录: 通用目录,放一些通用的处理 models目录&#xf…

达梦数据库(一)mysql2dm

达梦数据库(一)mysql2dm 文章目录 达梦数据库(一)mysql2dm一、安装篇ForWindows二、数据库初始化篇三、数据迁移篇出现的问题找不到对应表或者视图 注意字符集模式迁移出错大小写敏感解决方案 四、 代码修改篇group_concatGROUP BY方法一方法二(最笨)方法补充 多表联查更新参考…

【AI资讯】7.19日凌晨OpenAI发布迷你AI模型GPT-4o mini

性价比最高的小模型 北京时间7月19日凌晨,美国OpenAI公司推出一款新的 AI 模型“GPT-4o mini”,即GPT-4o的更小参数量、简化版本。OpenAI表示,GPT-4o mini是目前功能最强大、性价比最高的小参数模型,性能逼近原版GPT-4&#xff0…

python--实验15 数据分析与可视化

目录 知识点 1 数据分析概述 1.1流程 1.2定义 1.3数据分析常用工具 2 科学计算 2.1numpy 2.1.1定义 2.1.2创建数组的方式 2.1.3np.random的随机数函数 3 数据可视化 3.1定义 3.2基本思想 3.3Matplotlib库 3.3.1模块 4 数据分析 4.1Pandas 4.2数据结构 4.3基…

RE学习7.16-17

[HDCTF 2023]买了些什么呢 是一个经典的算法题吧 物品的重量和价值为: | 物品编号 | 重量 | 价值 | | 1 | 2 | 8 | | 2 | 5 | 1 | | 3 | 10 | 5 | | 4 | 9 | 9 | | 5 | 3 | 5 | | 6 | 6 | 6 | | 7 | 2 | 8 | | 8 | 2 | 2 | | 9 | 6 | 3 | | 10 | 8 | 7 | | 11 | 2 | 5 | | 1…