关于数据库的ACID几点

news2024/12/22 21:24:08

首先的话就是关于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.coloradmin.cn/o/1876973.html

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

相关文章

QT事件处理及实例(鼠标事件、键盘事件、事件过滤)

这篇文章通过鼠标事件、键盘事件和事件过滤的三个实例介绍事件处理的实现。 鼠标事件及实例 鼠标事件包括鼠标的移动、按下、松开、单击和双击等。 创建一个MouseEvent项目,通过项目介绍如何获得和处理鼠标事件。程序效果如下图所示。 界面布局代码如下&#xff…

【算法训练记录——Day36】

Day36——贪心Ⅳ 1.leetcode_452用最少数量的箭引爆气球2.leetcode_435无重叠区间3.leetcode_763划分字母区间4.leetcode_ 1.leetcode_452用最少数量的箭引爆气球 思路:看了眼题解,局部最优:当气球出现重叠,一起射,所用…

【工具推荐】Nuclei

文章目录 NucleiLinux安装方式Kali安装Windows安装 Nuclei Nuclei 是一款注重于可配置性、可扩展性和易用性的基于模板的快速漏洞验证工具。它使用 Go 语言开发,具有强大的可配置性、可扩展性,并且易于使用。Nuclei 的核心是利用模板(表示为简…

多机调度问题

#include<iostream> #include<string> using namespace std; struct work {int time;int number; }; int setwork0(int m,int n,int a[],struct work w[]) {int maxtime0;for(int i1; i<m; i){cout<<i<<"号设备处理作业"<<w[i].num…

AD9026芯片开发实录5-ADRV9026 - FAQ

1. What information should I provide to help speed resolution of my issue?  Please provide as much detail as possible including all of the detail described in the table below 2. What are the key specifications of ADRV9026 chip?  The ADRV9026 is a 4…

kafka学习笔记08

Springboot项目整合spring-kafka依赖包配置 有这种方式&#xff0c;就是可以是把之前test里的配置在这写上&#xff0c;用Bean注解上。 现在来介绍第二种方式&#xff1a; 1.添加kafka依赖&#xff1a; 2.添加kafka配置方式: 编写代码发送消息&#xff1a; 测试&#xff1a; …

ROS2自定义接口Python实现机器人移动

1.创建机器人节点接口 cd chapt3_ws/ ros2 pkg create example_interfaces_rclpy --build-type ament_python --dependencies rclpy example_ros2_interfaces --destination-directory src --node-name example_interfaces_robot_02 --maintainer-name "Joe Chen" …

【STM32】在标准库中使用定时器

1.TIM简介 STM32F407系列控制器有2个高级控制定时器、10个通用定时器和2个基本定时器。通常情况下&#xff0c;先看定时器挂在哪个总线上APB1或者APB2&#xff0c;然后定时器时钟需要在此基础上乘以2。 2.标准库实现定时中断 #ifndef __BSP_TIMER_H #define __BSP_TIMER_H#if…

计算机基础知识——C基础+C指针+char类型

指针 这里讲的很细 https://blog.csdn.net/weixin_43624626/article/details/130715839 内存地址&#xff1a;内存中每个字节单位都有一个编号&#xff08;一般用十六进制表示&#xff09; 存储类型 数据类型 *指针变量名&#xff1b;int *p; //定义了一个指针变量p,指向的数…

自研Eclipse插件的生成及安装和使用

说明&#xff1a; 本处是使用个人自研的Eclipse插件为例&#xff0c;创建了一个菜单式的插件组&#xff0c;插件组下&#xff0c;有一个生成右击Jakarta EE服务端点类后&#xff0c;生成端点对应的Restful客户端。有什么问题&#xff0c;欢迎大家交流&#xff01;&#xff01;…

仓库管理系统11--物资设置

1、添加用户控件 <UserControl x:Class"West.StoreMgr.View.GoodsTypeView"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc"http://schemas.openxm…

[小试牛刀-习题练]《计算机组成原理》之计算机系统概述【详解过程】

【计算机系统概述】 1、【冯诺伊曼结构】计算机中数据采用二进制编码表示&#xff0c;其主要原因是&#xff08;D&#xff09; I、二进制运算规则简单II、制造两个稳态的物理器件较为容易III、便于逻辑门电路实现算术运算 A.仅I、Ⅱ B.仅I、Ⅲ C.仅Ⅱ、Ⅲ D. I、Ⅱ、Ⅲ I…

redis 单节点数据如何平滑迁移到集群中

目的 如何把一个redis单节点的数据迁移到 redis集群中 方案&#xff1a; 使用命令redis-cli --cluster import 导入数据至集群 --cluster-from <arg>--cluster-from-user <arg> 数据源用户--cluster-from-pass <arg> 数据源密码--cluster-from-askpass--c…

Linux开发讲课20--- QSPI

SPI 是英语 Serial Peripheral interface 的缩写&#xff0c;顾名思义就是串行外围设备接口&#xff0c;一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且在芯片的管脚上只占用四根线&#xff0c;节约了芯片的管脚&#xff0c;为 PCB 的布局上节省空间…

《SpringBoot+Vue》Chapter04 SpringBoot整合Web开发

返回JSON数据 默认实现 依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>在springboot web依赖中加入了jackson-databind作为JSON处理器 创建一个实体类对象…

为什么Modbus链接/从机不通?From 摩尔信使MThings

为了回应用户平日里关于摩尔信使&#xff08;MThings&#xff09;使用过程中最常见的问题&#xff0c;包括“网络链接连不上”、“为什么不能增加串口”和“为什么从机不通”&#xff0c;我们在此统一介绍解决方法。 1、具备哪些通信能力 支持串口和网络两种通信方式。 需要…

我们后端程序员不是操作MyBatis的CRUD Boy

大家好&#xff0c;我是南哥。 一个对Java程序员进阶成长颇有研究的人&#xff0c;今天我们接着新的一篇Java进阶指南。 为啥都戏称后端是CRUD Boy&#xff1f;难道就因为天天怼着数据库CRUD吗&#xff1f;要我说&#xff0c;是这个岗位的位置要的就是你CRUD&#xff0c;你不…

FastAPI教程II

本文参考FastAPI教程https://fastapi.tiangolo.com/zh/tutorial Cookie参数 定义Cookie参数与定义Query和Path参数一样。 具体步骤如下&#xff1a; 导入Cookie&#xff1a;from fastapi import Cookie声明Cookie参数&#xff0c;声明Cookie参数的方式与声明Query和Path参数…

Hi3861 OpenHarmony嵌入式应用入门--LiteOS MessageQueue

CMSIS 2.0接口中的消息&#xff08;Message&#xff09;功能主要涉及到实时操作系统&#xff08;RTOS&#xff09;中的线程间通信。在CMSIS 2.0标准中&#xff0c;消息通常是通过消息队列&#xff08;MessageQueue&#xff09;来进行处理的&#xff0c;以实现不同线程之间的信息…

650V 1200V 碳化硅MOS TO247 封装 内阻30毫欧 40 80毫欧

650V 1200V 碳化硅MOS TO247 封装 内阻30毫欧 40 80毫欧