当前位置: 首页 > news >正文

ACID模型是什么

ACID模型是什么

ACID模型是数据库管理系统中保证事务处理安全性的一组特性。ACID是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)四个英文单词的首字母缩写。这些特性确保数据库事务是安全可靠的,即便在出现故障或异常情况时也能保持数据的完整性和准确性。

原子性(Atomicity)

原子性是指事务(Transaction)中的所有操作要么全部完成,要么全部不执行,事务在执行过程中不应该留下中间状态。如果事务成功完成,则其修改将永久保存到数据库中;如果事务在执行过程中失败,则系统将撤销其所有操作,回到事务开始前的状态。

它确保数据的一致性和整体性,即便在面对系统错误、硬件故障或其他异常情况时。例如,考虑一个银行应用,其中一项事务是从一个账户转账到另一个账户。这个事务包括两个步骤:从一个账户扣款和向另一个账户存款。原子性确保这两个操作要么都完成,要么都不完成,从而避免只执行了一个操作而导致的账户不平衡。

在MySQL中,原子性主要通过事务日志来实现。当一个事务开始时,所有的更改都会先被写入到这个日志中。只有在事务成功完成后,这些更改才会被提交到数据库中。如果事务失败或系统崩溃,MySQL会利用这些日志来回滚事务,撤销所有未完成的更改。

事务日志是一种持久化存储机制,用于在执行事务的过程中记录事务的每个操作。这包括数据的修改、添加或删除等信息。如果系统发生故障,事务日志将被用来重做或撤销未完成的事务。

  • 提交(Commit):当事务中的所有操作正常完成后,将通过一个提交操作永久地将这些变更写入数据库。
  • 回滚(Rollback):如果在执行事务的过程中发生错误或其他问题,事务将被回滚,即撤销所有已执行的操作,返回到事务开始之前的状态。

一致性(Consistency)

一致性确保事务从一个一致的状态转变到另一个一致的状态。在事务开始和完成时,数据库的完整性约束都必须保持满足。这意味着数据库中的所有数据规则都应当被遵守,比如唯一性、外键约束等,确保数据库状态的合法性。

一致性的实施是为了避免数据冗余和维护数据完整性。考虑以下场景:

  • 数据完整性:在银行系统中转账事务,不仅需要确保总金额保持不变,还需要确保不会因为软件错误、硬件故障或其他原因导致数据损坏。
  • 业务规则的遵守:企业数据库通常需要执行复杂的业务规则,如库存不能低于某个阈值。一致性确保这些业务逻辑在数据修改后仍然成立。

数据库管理系统通过强制执行各种数据约束来保持一致性,例如:

  • 主键约束:确保每个表中的记录具有唯一的标识。
  • 外键约束:确保表之间的引用完整性。
  • 检查约束(CHECK约束):确保特定的列满足预定的条件。

数据库事务通过使用事务控制语句来维护一致性,例如COMMITROLLBACK

  • 提交(COMMIT):如果所有的操作都符合约束和业务规则,事务将被提交,所有数据修改将永久保存。
  • 回滚(ROLLBACK):如果事务中的操作违反了约束或未能通过某些业务规则的验证,那么进行的所有修改将被撤销。

隔离性(Isolation)

隔离性是指当多个用户并发访问数据库时,数据库系统能够为每个用户的事务提供一个独立的运行环境,好像用户是在独自使用数据库一样。这防止了事务之间的不当交互,如更新丢失、脏读、不可重复读和幻读等问题。

MySQL提供了多种隔离级别来实现不同程度的事务隔离,包括READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。每种隔离级别都以不同的方式处理并发事务中的数据可见性和干扰,允许数据库管理员根据具体的应用需求来选择合适的隔离级别。

  • READ UNCOMMITTED(未提交读RU):一个事务还没提交时,它做的变更就能被别的事务看到。因此,它可能导致脏读,即一个事务读取了另一个事务还未提交的数据。如果那个事务回滚,读取的数据就会变得无效。
  • READ COMMITTED(已提交读RC):一个事务只能看到其他事务已经提交的修改。这可以避免脏读。然而,它仍然允许不可重复读的发生,因为在同一个事务中,一个记录的两次读取之间,其他事务可以修改或提交数据,从而导致不一致的查询结果。
  • REPEATABLE READ(可重复读RR):保证在同一个事务中多次读取同一数据的结果是一致的,即该事务不会看到其他事务提交的对这些数据的修改。这个级别防止了脏读和不可重复读,但通常不能防止幻读,即事务在执行过程中其他事务插入符合查询条件的新记录。 InnoDB默认级别 。
  • SERIALIZABLE(串行化):最高的隔离级别,它完全隔离事务,使得事务只能一个接一个地执行,而不是并发执行。这个级别可以防止脏读、不可重复读和幻读。实际上,它通过对涉及的数据集加锁(范围锁或其他机制),确保了事务之间完全的隔离。

在没有良好隔离性的数据库系统中,可能会发生多种并发问题,如:

  1. 脏读(Dirty Read):一个事务可能读取到另一个事务尚未提交的修改。
  2. 不可重复读(Non-repeatable Read):一个事务对同一数据的多次读取中,可能因其他事务已提交的更新而得到不同的结果。
  3. 幻读(Phantom Read):一个事务重新执行相同的查询,可能会发现已经提交的事务添加了满足查询条件的新记录。
  4. 丢失修改(Lost Update):两个事务同时修改同一数据,最终只有一个事务的修改得以保存。

持久性(Durability)

持久性意味着一旦事务被提交,它对数据库的更改就是永久性的,即使系统发生故障,这些更改也不会丢失。这通常通过将事务日志记录到非易失性存储器中实现。

持久性的核心作用是确保数据的可靠性和安全性。在任何需要长期保留关键数据的系统中,持久性都是至关重要的。例如,在银行系统中,交易记录的持久保存对于防止数据丢失和保证账户安全至关重要。

为了保证数据的持久性,数据库管理系统采用了多种技术和策略,其中包括:

写前日志(Write-Ahead Logging, WAL)

写前日志是一种常用的技术,用于保证事务的持久性。在这种机制下,任何数据的更改在实际写入数据库之前,首先被记录到日志文件中。这样,即使在数据写入过程中系统崩溃,数据库也可以在重启后使用日志文件恢复到最后一次成功的事务状态。

检查点(Checkpoints)

检查点是定期创建的数据库快照,记录了那一刻数据库的完整状态。通过创建检查点,数据库可以减少在系统崩溃后数据恢复所需的时间,因为它只需从最近的检查点开始重播日志文件,而不是从头开始。

复制和冗余

为了增强数据的持久性和提高系统的容错能力,许多数据库系统采用数据复制和存储冗余技术。通过在多个地点或设备上保存数据副本,即使主存储设备发生故障,也可以从副本中恢复数据。

事务的持久性确认

在某些数据库系统中,事务的持久性只有在相关的数据被物理写入到磁盘上后才会被确认。这通常涉及多个底层写操作,包括更新磁盘上的数据块和刷新磁盘缓存。

MySQL通过使用重做日志(redo log)来实现持久性。当事务被提交时,所有相关的更改都会被写入到这些日志中。即使数据库发生崩溃,重做日志也可以在系统恢复后被用来重建更改,确保事务的持久性。

参考链接

  • ACID特性简介:https://en.wikipedia.org/wiki/ACID
  • 数据库事务和ACID特性:https://www.ibm.com/docs/en/db2/11.5?topic=concepts-acid-properties

在这里插入图片描述

相关文章:

ACID模型是什么

ACID模型是什么 ACID模型是数据库管理系统中保证事务处理安全性的一组特性。ACID是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)四个英文单词的…...

【Linux】基础IO----理解缓冲区

> 作者:დ旧言~ > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:理解缓冲区 > 毒鸡汤:有些事情,总是不明白,所以我不会坚持。早安! > 专栏选自:Linux初阶 > 望…...

java学习之路-继承

文章目录 前言 目录 1.1继承的概念 1.2继承有什么好处,为何要继承 1.3继承的语句 1.4父类成员的访问 1.4.1 子类中访问父类的成员变量 1.4.2 子类中访问父类的成员方法 1.5 super关键字 2.子类构造方法 2.1如何创建构造方法 2.2创建构造方法 3.super和this 【相同点…...

Linux系统——Elasticsearch企业级日志分析系统

目录 前言 一、ELK概述 1.ELK简介 2.ELK特点 3.为什么要使用ELK 4.完整日志系统基本特征 5.ELK工作原理 6.Elasticsearch介绍 6.1Elasticsearch概述 6.2Elasticsearch核心概念 7.Logstash介绍 7.1Logstash简介 7.2Logstash主要组件 8.Kibana介绍 8.1Kibana简介 …...

多协议接入视频汇聚EasyCVR平台vs.RTSP安防视频EasyNVR平台:设备分组的区别

EasyCVR视频融合云平台则是旭帆科技TSINGSEE青犀旗下支持多协议接入的视频汇聚融合共享智能平台。平台可支持的接入协议比EasyNVR丰富,包括主流标准协议,有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海…...

Spring Security Oauth2 之 理解OAuth 2.0授权流程

1. Oauth 定义 1.1 角色 OAuth定义了四个角色: 资源所有者 一个能够授权访问受保护资源的实体。当资源所有者是一个人时,它被称为最终用户。 资源服务器 托管受保护资源的服务器能够使用访问令牌接受和响应受保护的资源请求。 客户 代表资源所有…...

mysql题目4

tj11: select count(*) 员工总人数 from tb_dept a join tb_employee b on a.deptnob.deptno where a.dname 市场部...

GFS部署实验

目录 1、部署环境 ​编辑 2、更改节点名称 3、准备环境 4、磁盘分区,并挂载 5. 做主机映射--/etc/hosts/ 6. 复制脚本文件 7. 执行脚本完成分区 8. 安装客户端软件 1. 安装解压源包 2. 创建gfs 3. 安装 gfs 4. 开启服务 9、 添加节点到存储信任池中 1…...

最前沿・量子退火建模方法(1) : subQUBO讲解和python实现

前言 量子退火机在小规模问题上的效果得到了有效验证,但是由于物理量子比特的大规模制备以及噪声的影响,还没有办法再大规模的场景下应用。 这时候就需要我们思考,如何通过软件的方法怎么样把大的问题分解成小的问题,以便通过现在…...

如何在Linux部署MeterSphere并实现公网访问进行远程测试工作

文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网远程访问MeterSphere6. 固定MeterSphere公网地址 前言 MeterSphere 是一站式开源持续测试平台, 涵盖测试跟踪、接口测试、UI 测试和性能测试等功能&am…...

postgis导入shp数据时“dbf file (.dbf) can not be opened.“

作者进行矢量数据导入数据库中出现上述报错 导致报错原因 导入的shp文件路径太深导入的shp文件名称或路径中有中文将需要导入数据的shp 文件、dbf 文件、prj 等文件放在到同一个文件夹内,且名字要一致;导入失败: 导入成功:...

StarUML笔记之从C++代码生成UML图

StarUML笔记之从C代码生成UML图 —— 2024-04-14 文章目录 StarUML笔记之从C代码生成UML图1.安装C插件2.准备好一个C代码文件放某个路径下3.点击Reverse Code选择项目文件夹4.拖动(Class)到中间画面可以形成UML5.另外一种方式:双击Type Hierarchy,然后…...

sizeof()和strlen

一、什么是sizeof() sizeof()是一个在C和C中广泛使用的操作符,用于计算数据类型或变量所占内存的字节数。它返回一个size_t类型的值,表示其操作数所占的字节数。 在使用时,sizeof()可以接收一个数据类型作为参数,也可以接收一个…...

Python学习笔记13 - 元组

什么是元组 元组的创建方式 为什么要将元组设计为不可变序列? 元组的遍历...

[leetcode]remove-duplicates-from-sorted-list-ii

. - 力扣(LeetCode) 给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。 示例 1: 输入:head [1,2,3,3,4,4,5] 输出:[1,2,5]示例 2&…...

共享内存和Pytorch中的Dataloader结合

dataloader中通常使用num_workers来指定多线程来进行数据的读取。可以使用共享内存进行加速。 代码地址:https://github.com/POSTECH-CVLab/point-transformer/blob/master/util/s3dis.py 文章目录 1. 共享内存和dataloader结合1.1 在init中把所有的data存储到共享内…...

分享 WebStorm 2024 激活的方案,支持JetBrains全家桶

大家好,欢迎来到金榜探云手! WebStorm公司简介 JetBrains 是一家专注于开发工具的软件公司,总部位于捷克。他们以提供强大的集成开发环境(IDE)而闻名,如 IntelliJ IDEA、PyCharm、和 WebStorm等。这些工具…...

Android OOM问题定位、内存优化

一、OOM out of memory:简称OOM,内存溢出,申请的内存大于剩余的内存而抛出的异常。 对于Android平台,广义的OOM主要是以下几种类型 JavaNativeThread 线程数的上限默认为32768,部分华为设备的限制是500通常1000左右…...

棋盘(c++题解)

题目描述 有一个m m的棋盘,棋盘上每一个格子可能是红色、黄色或没有任何颜色的。你现在要从棋盘的最左上角走到棋盘的最右下角。 任何一个时刻,你所站在的位置必须是有颜色的(不能是无色的) ,你只能向上、下、 左、右…...

滑动窗口例题

一、209:长度最小的子数组 209:长度最小的子数组 思路:1、暴力解法:两层for循环遍历,当sum > target时计算子数组长度并与result比较,取最小的更新result。提交但是超出了时间限制。 class Solution {public int minSubArray…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...

Go语言多线程问题

打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...