ACID模型是什么

news2025/5/25 1:11:18

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

在这里插入图片描述

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

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

相关文章

WebApi+Python PyQ5实现大文件下载,Ui增加进度条和下载速率+已验证uos和Windows环境

Web Api接品代码: using Microsoft.AspNetCore.Mvc; using System.Collections.Concurrent; using System.Net;namespace LargeFileHandling.Controllers {[ApiController][Route("[controller]")]public class TestProgramFileManagerController : Cont…

【鸿蒙开发】第二十章 Camera相机服务

1 简介 开发者通过调用Camera Kit(相机服务)提供的接口可以开发相机应用,应用通过访问和操作相机硬件,实现基础操作,如预览、拍照和录像;还可以通过接口组合完成更多操作,如控制闪光灯和曝光时间、对焦或调焦等。 2 …

js canvas实现裁剪图片并下载

简历上给自己挖的坑,面试被拷打,早就该填了T.T 参考:【js canvas实现图片裁剪】 https://www.bilibili.com/video/BV1QK411d7n1/?share_sourcecopy_web&vd_sourcebf743b20b76eab11028ba2fb05f056b4 效果 思路 组成: 上传文…

8. Spring Boot 配置文件

源码地址:SpringBoot_demo 本篇文章内容源码位于上述地址的com/chenshu/springboot_demo/config包下 1. 配置文件是什么 上节说到,Spring Boot的项目分为三个部分:源代码目录、资源目录、单元测试目录。 而配置文件的位置就位于资源目录res…

【竞技宝jjb.lol】LOL:T1成功击败HLE晋级MSI!

北京时间2024年4月13日,英雄联盟LCK2024春季季后赛继续进行,昨天迎来败者组决赛HLE对阵T1。本场比赛HLE率先拿下一局之后,T1连续两局在后期决策上碾压HLE拿到赛点,第四局zeus祭出上单VN在中期杀穿HLE后排,最终T1以3-1的比分击败HLE晋级春季决赛,同时也拿到了MSI的参赛资格。以下…

CSS3 常用样式

个人主页:学习前端的小z 个人专栏:HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! 文章目录 ✍CSS3 常用样式💎1 CSS3 新增选择器🌹1.1 属性选择器…

Python匿名函数4不要

当你需要完成一件小工作时,在本地环境中使用这个函数,可以让工作如此得心应手,它就是Lambda 函数。 Lambda 函数是 Python 中的匿名函数。有些人将它们简称为lambdas,它们的语法如下: lambda arguments: expressionl…

拥有了这24个Python接单平台,你就拥有了“钞能力”

学Python能兼职挣米吗?怎么挣? 一、Python兼职种类: 接私活刚学会python那会,就有认识的朋友介绍做一个网站的私活,当时接单赚了4K,后又自己接过开发网站后台接口、做数据处理等事情,都赚了一…

Python实现外观模式、桥接模式、组合模式和享元模式

今天介绍四种结构型设计模式:外观模式、桥接模式、组合模式和享元模式 外观模式 外观模式(Facade Pattern),它为子系统提供一个统一的接口,使得子系统更加容易使用。 在Python中,我们可以通过定义一个外…

记录-若依前端集成markdown文档,自动生成文档目录

使用版本: vue 2.6.12 html-loader 1.3.2 markdown-loader 6.0.0 github-markdown-css ^5.5.1 highlight.js 9.18.5 webpack 4.47.x 一.引入loder插件,html-loader和markdown-loader //安装 pnpm install html-loader --save ; pnpm install markdown-loader --sa…

Zynq学习笔记--AXI 总线概述

目录 1. AXI总线概述 1.1 主要特点 1.2 通道功能 1.3 信号概览 2. AXI Interconnect 2.1 信号说明 2.2 内部结构 3. PS-PL AXI Interface 3.1 AXI FPD/LFP/ACP 3.2 Address Editor 3.3 地址空间 3.4 AXI-DDR 4. 通过ILA观察AXI信号 4.1 AXI 读通道 1. AXI总线概述…

头歌-机器学习 第15次实验 朴素贝叶斯分类器

第1关:条件概率 任务描述 本关任务:根据本节课所学知识完成本关所设置的选择题。 相关知识 为了完成本关任务,你需要掌握条件概率。 条件概率 朴素贝叶斯分类算法是基于贝叶斯定理与特征条件独立假设的分类方法,因此想要了解朴素贝叶斯分类算法背后的算法原理,就不得…

STM32-看门狗

1、看门狗是什么:就是一个向下定时器,定时时间一到,就会触发一个向下的复位的中断,使单片机开始工作 2、作用:MCU微控制器构成的微型计算机系统中,由于微控制器的工作常常会受到来自外界电磁场的干 扰,造成…

PostgreSQL入门到实战-第二十六弹

PostgreSQL入门到实战 PostgreSQL中数据分组操作(一)官网地址PostgreSQL概述PostgreSQL中GROUP BY命令理论PostgreSQL中GROUP BY命令实战更新计划 PostgreSQL中数据分组操作(一) 如何使用PostgreSQL GROUP BY子句将行分组。 官网地址 声明: 由于操作系统, 版本更新等原因, 文…

Transformer 结构浅析

Transformer 结构浅析 文章目录 Transformer 结构浅析Transformer 网络结构编码器位置编码多头注意力层Add&NormFeed Forward 解码器带掩码的多头注意力层多头注意力层 预测 Transformer 网络结构 Transformer模型的网络结构如图,且transformer结构主要分为两部…

编曲知识18:EQ均衡器 齿音处理 呼吸音处理 口水音处理

EQ均衡器 齿音处理 呼吸音处理 口水音处理小鹅通-专注内容付费的技术服务商https://app8epdhy0u9502.pc.xiaoe-tech.com/live_pc/l_66151c90e4b092c1187ac699?course_id=course_2XLKtQnQx9GrQHac7OPmHD9tqbv 均衡器 均衡器 Equalizer(简称EQ) 人耳接受频率:20hz—20khz …

python基础——类型注解【变量,函数,Union】

📝前言: 上一篇文章Python基础——面相对象的三大特征提到,python中的多态,python中,类型是动态的,这意味着我们不需要在声明变量时指定其类型。然而,这可能导致运行时错误,因为我们…

【每日一算】冒泡算法

冒泡算法就是给数据排序的意思。比如说升序,17,8,9,28,5.升序之后的结果就是5,8,9,17,28. 从我们的大脑思维来看,结果一眼就有了,可是机器要怎么才…

论文阅读:Polyp-PVT: Polyp Segmentation with PyramidVision Transformers

这篇论文提出了一种名为Polyp-PVT的新型息肉分割框架,该框架采用金字塔视觉变换器(Pyramid Vision Transformer, PVT)作为编码器,以显式提取更强大的特征。本模型中使用到的关键技术有三个:渐进式特征融合、通道和空间…

Linux 【进程】

什么是进程 Linux中的进程是指正在运行的程序实例。每个进程都是操作系统内部管理的独立实体,具有自己的地址空间、代码、数据和打开的文件等资源。进程是并发执行的基本单位,可以同时运行多个进程。 Linux中的进程通过创建父子关系形成一个进程树。当一…