关于数据库的ACID几点

首先的话就是关于ACID,最重要的就是原子性了,这是基础。

原子性是指事务包含的所有操作,要么全部完成,要么全部不完成。如果不能保证原子性,可能会出现以下问题:

数据不一致:事务中的部分操作可能对数据做出了更改,而其他操作由于某种原因(如系统故障、操作错误等)未能完成,导致数据状态不一致。
资源泄露:如果一个操作分配了资源(如内存或文件描述符)而未能成功地释放或回滚,可能会导致资源泄露。
系统可靠性下降:当多个事务相互依赖时,一个事务的部分完成可能导致其他事务无法继续,影响系统的整体可靠性。
假如你在网上购物,支付环节需要从你的银行账户扣款,并将相应金额增加到商家账户。如果扣款成功,但增款失败,没有原子性的保护,你的账户会减少相应的金额,而商家却没有收到钱,导致交易不公平。

MySQL怎么保证原子性的?
MySQL通过事务(Transaction)来保证原子性。事务是一个不可分割的工作单位,事务内的操作要么全部完成,要么全部不完成,这就是原子性。

在MySQL中,为了保证事务的原子性,它使用了以下两种主要的技术:

Undo Log(撤销日志): Undo Log记录了事务执行前的旧数据信息,当事务执行过程中出现错误,或者用户执行ROLLBACK语句进行事务回滚时,可以利用Undo Log中的信息将数据库恢复到事务开始前的状态
Redo Log(重做日志): 当MySQL异常宕机时,Redo Log可以用来恢复正在执行中的事务。它记录了事务中所有的修改操作,用于在MySQL重启后,重新执行这些操作以保证数据一致性。
这两种日志机制的结合使用,即在出现错误回滚中使用Undo Log,和在系统崩溃时利用Redo Log进行恢复,使MySQL可以成功保证事务的原子性。

需要注意的是只有使用了InnoDB存储引擎的MySQL支持事务,MyISAM存储引擎并不支持事务。

如果无法保证隔离性会怎么样?
如果数据库无法保证事务的隔离性,将会出现以下并发问题:

脏读(Dirty Reads):当一个事务可以读取另一个事务未提交的数据时,若后者回滚,则前者读取到的就是不正确的数据。
不可重复读(Non-repeatable Reads):在一个事务的两次查询之间,另一个并发事务进行了更新操作,导致第一个事务两次读到的数据不一致。
幻读(Phantom Reads):当一个事务重新读取之前查询过的数据范围时,发现有其他事务新增的记录,看似产生了"幻影"数据。
丢失更新(Lost Updates):两个事务同时读取相同的数据并更新它,可能会导致其中一个事务的更新被覆盖。
例如,如果银行系统无法保证隔离性,在处理多个客户的转账操作时可能会出现资金计算错误。一个客户的转账可能会基于另一个客户正在处理但未完成的交易,最终导致资金总额的不一致。

MySQL怎么保证隔离性的?
MySQL保证隔离性主要是通过所谓的“隔离级别”实现的。隔离性是指并发执行的事务之间不相互影响,每个事务都感觉好像自己在独占系统。

在MySQL中,支持四种隔离级别:

读未提交 (READ UNCOMMITTED):在该级别下,一个事务可以读取到另一个事务修改但还未提交的数据,也被称为"脏读"。这种隔离级别并发性最好,但是一般很少使用,因为它可能读取到未提交的数据。
读已提交 (READ COMMITTED):这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的基本要求,一个事务只能读取已经提交的数据。
可重复读(REPEATABLE READ):在同一事务内的查询都能够看到一致的快照数据。也就是说,在事务开始后,无论其他事务如何修改数据,本事务都能看到同样的数据。MySQL默认的隔离级别就是REPEATABLE READ。在该级别下,除了防止"脏读",还防止了"不可重复读"。
串行化(SERIALIZABLE):这是最高的隔离级别,它要求所有事务都串行执行。也就是说,同一时间只能有一个事务在执行。虽然可以提供最高级别的隔离性,但是在并发环境中性能开销也是最大的。
在InnoDB存储引擎中,另一个叫做"多版本并发控制(MVCC)"的技术也对事务的隔离色提供支持。每次对数据的更新操作,InnoDB都会为该数据创建一个新的版本,而不是在原数据上直接修改,这样就可以通过读取旧版本的数据来避免阻塞读操作,增强并发性能,从而保证隔离性。

如下图所示为隔离级别与并发问题的关系:

如果无法保证持久性会怎么样?
如果无法保证持久性,那么在事务提交后,如果发生系统崩溃或者其他故障,那么这个事务的修改结果可能会丢失,没有被永久的保存在数据库中。

持久性是指当事务被认为是已经结束时,对数据的改变就是永久性的。该特性保证了即使在系统崩溃或者电源故障后,已经提交的数据仍然可以保持,不会丢失。

比如:假设某电商网站使用MySQL数据库来存储用户订单信息。这个订单首先被创建并存储在数据库的内存缓冲区中,等待最终被写入到磁盘上的数据库文件,在订单信息被写入磁盘之前,停电了。这时候当系统重启后,订单信息将丢失

MySQL是如何保证持久性的?
MySQL通过"写前日志"(Write-Ahead-Logging,即WAL)策略,确保了事务的持久性。持久性是指一旦事务完成(即,commit),对数据的修改就是永久性的。即便发生系统崩溃,修改的数据也不会丢失。

具体实现如下:

Redo Log(重做日志): 这是MySQL中最核心的保证持久性的机制。当InnoDB数据库引擎进行任何改变数据的操作时,首先会把这些操作写入到内存中的Redo Log Buffer,然后再按照一定频率(如每秒、事务提交时、buffer满了等)将这些操作永久的记录到磁盘的Redo Log中,而不是直接将修改操作写到磁盘的数据文件。当数据库异常重启时,虽然数据文件没有来得及持久化的更改可能丢失,但是redo log已经记录了所有改变数据的操作,MySQL可以通过_redo_操作进行数据恢复,以保证数据的持久性。
Binlog(二进制日志): 这是MySQL服务器层的持久性保证机制,在每次事务提交的时候,会把事务的所有操作(包括SQL语句)写入到Binlog中,同时写入磁盘保证持久性。在数据主从同步或者数据恢复时,可以重放Binlog中记录的所有操作。
这两种机制,尤其是Redo Log,保证了MySQL的持久性,即使在数据库崩溃后也能通过重播保证不丢失
 

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

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

相关文章

AI基础:从线性回归到梯度下降

一个简单的问题: 如果此时你正站在迷路缭绕的山坡上,能见度不高,但是你又想去往最低的山谷的位置,怎么走? 很简单,哪里陡那就往那里走呗——而这就是梯度下降算法的思想。 古话说:“先发制于人…

java基于ssm+jsp 电子商城系统

1管理员功能模块 管理员登录,通过填写用户名、密码进行登录,如图1所示。 图1管理员登录界面图 管理员登录进入电子商城系统可以查看个人中心、用户管理、医生管理、药品信息管理、线上诊疗管理、医生信息管理、管理员管理、论坛管理、系统管理、订单管…

行业推荐!IG5216量产工具下载,IG5216开卡软件分享

国内固态硬盘常用,且有量产工具流传出来的主控厂商包括慧荣、群联、点序、英韧、得一微、瑞昱、联芸、迈威、国科、华澜微等等。 每个主控需要用各自对应的量产工具,不同的量产工具支持的闪存颗粒也有差异,因此要根据固态硬盘实际的主控型号…

气膜建筑审批流程及现状分析—轻空间

气膜建筑作为一种新兴的建筑形式,以其快速建造、成本低廉和灵活多变的优势在各个领域得到了广泛应用。然而,气膜建筑在我国尚未被纳入正式的建筑规范,这使得其审批流程与传统建筑有显著差异。轻空间将详细探讨气膜建筑的审批流程及其在实际操…

MongoDB:JSON and BSON

目录 什么是 JSON MongoDB-JSON连接 什么是 BSON MongoDB 使用 BSON 还是 JSON JSON 与 BSON 架构灵活性和数据治理 JSON 和 BSON 是近亲,正如它们几乎相同的名称所暗示的那样JSON(即 JavaScript 对象表示法)是网络上广泛流行的数据交换…

Transformer 结构

目录 一、Transformer 的整体结构二、Input Encoding三、Transformer Block3.1 Encoder3.1.1 Attention3.1.2 Self-attention3.1.3 Multi-head Attention 3.2 Decoder3.2.1 Masked Multi-head Attention 四、Transformer 的优缺点 遇到看不明白的地方,欢迎在评论中留…

Leetcode 矩阵问题

36题.有效的数独 此类问题特点是给出行列的多种限定条件,数独限制每行每列每个小九宫格元素范围为1-9且不可重复 。解决此类问题最简单的想法就是使用哈希set,记录每行,每列,每个小九宫格已经出现的元素。在遍历矩阵时提前做出是否…

S32K3 --- Wdg(内狗) Mcal配置

前言 看门狗的作用是用来检测程序是否跑飞,进入死循环。我们需要不停地喂狗,来确保程序是正常运行的,一旦停止喂狗,意味着程序跑飞,超时后就会reset复位程序。 一、Wdg 1.1 WdgGeneral Wdg Disable Allowed : 启用此参数后,允许在运行的时候禁用看门狗 Wdg Enable User…

技术干货丨如何加速工业数字孪生应用落地?

什么是数字孪生? “孪生”概念最早可追溯至NASA的阿波罗项目,随着数字化技术的进步,“孪生”概念应用从物理孪生向数字孪生发展。即“数字孪生”是对资产、进程或系统的一种数字化表示,并通过信息交互、数据同步等方式实现物理实体…

Java校园跑腿小程序校园代买帮忙外卖源码社区外卖源码

🔥校园跑腿与外卖源码揭秘🔥 🚀 引言:为何需要校园跑腿与外卖源码? 在快节奏的校园生活里,学生们对于便捷、高效的服务需求日益增长。校园跑腿和外卖服务成为了解决这一需求的热门选择。然而,…

实时智能全托管-云器Lakehouse重新定义多维数据分析

导读 本文将分享云器Lakehouse如何重新定义实时多维分析,帮助客户实现实时、智能、全托管的数据平台。主要内容包括以下几大部分: 多维数据分析的发展趋势和场景解析 技术解析:新一代数平台Lakehouse如何支持实时分析需求 价值解析&#x…

嵌入式linux系统中面试过程经验分享

大家好,今天主要给分享一下,如何在面试中介绍自己的项目经验,希望对大家有所帮助。 在面试时,经过寒暄后,一般面试官会让介绍项目经验。常见的问法是,说下你最近的(或最拿得出手的)一个项目。 根据我们的面试经验,发现有不少候选人对此没准备,说起来磕磕巴巴,甚…

vscode在windows系统上进行C/C++环境配置

随手笔记前言 vscode在windows系统上进行C/C环境配置 步骤如下 第一步 下载安装VSCode 这应该是最简单的一步,相信大家自己就可以完成。如果在vscode官网感觉下载特别慢的话,可以去试一下腾讯软件中心,我都是在这个网页上下载的。下载好之…

26、 MySQL数据库基础练习系列股票交易系统基础查询和复杂查询

5、基础查询 -- 1、查询用户信息仅显示姓名与手机号 SELECT username as 姓名,phone as 手机号 from users;-- 2、模糊查询和explain语句 alter table stocks add index stock_name_index(stock_name); explain SELECT * from stocks where stock_name like %东吴证券%; -- 3、…

【AIGC X UML 落地】从UML语句到UML图形的生成,来看Agent插件的制作

上篇我们讲到如何通过多智能体实现自然语言绘制UML图。 没有看过的,可以去看下原文:《【AIGC X UML 落地】通过多智能体实现自然语言绘制UML图》 其中有一个实现重点,就是如何将 PlantUML 语句生成 UML 图片。在这里笔者是通过自定义 Agent 插件来实现这一流程。 本文,就此…

面试-javaIO机制

1.BIO BIO:是传统的javaIO以及部分java.net下部分接口和类。例如,socket,http等,因为网络通信同样是IO行为。传统IO基于字节流和字符流进行操作。提供了我们最熟悉的IO功能,譬如基于字节流的InputStream 和OutputStream.基于字符流…

Vue 项目运行时,报错Error: Cannot find module ‘node:path‘

Vue 项目运行时,报错Error: Cannot find module ‘node:path’ internal/modules/cjs/loader.js:883throw err;^Error: Cannot find module node:path Require stack: - D:\nodejs\node_modules\npm\node_modules\node_modules\npm\lib\cli.js - D:\nodejs\node_mo…

问题解决:python安装依赖时网络问题报错

进行 pip install 时,安装轮子访问过慢而造成安装失败,有时候配置镜像源仍会出现莫名其妙的问题,包括网络代理问题等。看了一些解决方案,找出了一个最适合的方式,如下所示: pip install -i https://pypi.t…

linux 离线安装docker

测试服务器:银河麒麟V10 x86_64 注意:推荐使用国内的镜像站下载,因为官网不挂梯子无法访问,我用的是清华大学开源软件镜像站 一、下载离线包: 官网下载docker离线包 下载地址:https://download.docker.c…

使用VisualStudio2022制作安装包

总体介绍 解决方案里面需要有三个项目: Winform程序, Setup Project , 自定义配置项目(安装程序类) 1, Winform程序 就是你要打包的程序 2, Setup Project 就是制作安装包的 3, 自定义配置项目(安装程序类): 一个命令行项目里面只有一个安装程序类,用来控制安装后自动打开程序…