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

在这里插入图片描述

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

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

相关文章

开源博客项目Blog .NET Core源码学习(15:App.Hosting项目结构分析-3)

本文学习并分析App.Hosting项目中前台页面的关于本站页面和点点滴滴页面。 关于本站页面 关于本站页面相对而言布局简单,与后台控制器类的交互也不算复杂。整个页面主要使用了layui中的面包屑导航、选项卡、模版、流加载等样式或模块。   面包屑导航。使用layui…

初探vercel托管项目

文章目录 第一步、注册与登录第二步、本地部署 在个人网站部署的助手vercel,支持 Github部署,只需简单操作,即可发布,方便快捷! 第一步、注册与登录 进入vercel【官网】,在右上角 login on,可登…

WXML模板语法-条件与列表渲染

wx:if 在小程序中&#xff0c;使用wx:if"{{condition}}"来判断是否需要渲染该代码 也可以用wx:elif和wx:else来添加else判断 <!--pages/ifIndex/ifindex.wxml--> <view wx:if"{{type 1}}">男</view> <view wx:elif"{{type …

【Linux】磁盘与文件系统管理

目录 一、 磁盘结构 1. 数据结构 2. 物理结构 3. 硬盘的接口类型 二、 如何使用Linux中的磁盘 三、 文件系统 四、 磁盘分区 1. MBR分区 2. 分区的优缺点 3. 磁盘及分区的管理工具 五、格式化与挂载 1. 格式化 2. 挂载 六、实例演示 1. 演示分区格式化挂载 2. …

24年大一4月14日训练(东北林业大学)

前言&#xff1a; 今晚的5道题。 正文&#xff1a; Problem:A宋哥猜拳(2)&#xff1a; #include<bits/stdc.h> using namespace std; int main(){int t;cin>>t;while(t--){string x;cin>>x;int a0,b0,c0,lx.length();// cout<<l;for(int i0;i<l;i…

反射与动态代理

一、反射 什么是反射? 反射允许对成员变量&#xff0c;成员方法和构造方法的信息进行编程访问 1.获取class对象的三种方式 Class这个类里面的静态方法forName&#xff08;“全类名”&#xff09;&#xff08;最常用&#xff09; 通过class属性获取 通过对象获取字节码文件对…

20240414,类的嵌套,分文件实现

笑死&#xff0c;和宝哥同时生病了 一&#xff0c;封装-案例 1.0 立方体类 #include<iostream>//分别用全局函数和成员函数判定立方体是否相等 using namespace std;class Cube { public:int m_area;int m_vol;int geth(){return m_h;}int getl() { return m_l; }int…

C# Window form 自定义控件的结构和设计(三)

C# Window form 自定义控件的结构和设计(三) 一、前面介绍了如何来创建第一个自定义的控件&#xff0c;以及一个测试程序。下面我们来看下如何在自定义控件中添加属性。 C#和其他.NET语言支持属性作为语言的第一类成员。把属性作为语言的基础属性有两点主要的有点&#xff1a…

Flutter第八弹 构建拥有不同项的列表

目标&#xff1a;1&#xff09;项目中&#xff0c;数据源可能涉及不同的模版&#xff0c;显示不同类型的子项&#xff0c;类似RecycleView的itemType, 有多种类型&#xff0c;列表怎么显示&#xff1f; 2&#xff09;不同的数据源构建列表 一、创建不同的数据源 采用类似Rec…

【设计模式】六大设计原则

设计原则 研究 23 种设计模式是困难的&#xff0c;甚至是没必要的六大设计原则零、单一职责原则开闭原则里氏代换原则依赖倒置原则接口隔离原则迪米特法则合成复用原则 研究 23 种设计模式是困难的&#xff0c;甚至是没必要的 设计模式有23种&#xff0c;我认为对普通人来说想…

快速寻找可以构建出网通信隧道的计算机

点击星标&#xff0c;即时接收最新推文 本文选自《内网安全攻防&#xff1a;红队之路》 扫描二维码五折购书 为加强内网的安全防范&#xff0c;安全管理员往往会限制内网计算机访问互联网&#xff0c;当然不同机构的限制策略是不一样的&#xff0c;有的完全阻断了内网计算机访问…

如何发布自己的Python库?

Python包发布 1、背景概述2、操作指南 1、背景概述 为什么我们要发布自己的Python库&#xff1f;如果你想让你的Python代码&#xff0c;通过pip install xxx的方式供所有人下载&#xff0c;那就需要将代码上传到PyPi上&#xff0c;这样才能让所有人使用 那么&#xff0c;如何发…

群晖双硬盘实时备份(WebDAV Server+Cloud Sync)

安装和设置 WebDAV Server WebDAV 是一种基于HTTP的协议扩展&#xff0c;它允许用户在远程Web服务器上进行文档的编辑和管理&#xff0c;就如同这些文件存储在本地计算机上一样。使用WebDAV&#xff0c;用户可以创建、移动、复制和修改文件和文件夹。 安装和设置 Cloud Sync…

使用 Prometheus 在 KubeSphere 上监控 KubeEdge 边缘节点(Jetson) CPU、GPU 状态

作者&#xff1a;朱亚光&#xff0c;之江实验室工程师&#xff0c;云原生/开源爱好者。 KubeSphere 边缘节点的可观测性 在边缘计算场景下&#xff0c;KubeSphere 基于 KubeEdge 实现应用与工作负载在云端与边缘节点的统一分发与管理&#xff0c;解决在海量边、端设备上完成应…

地球上四大洋介绍

地球上四大洋的分布是&#xff1a; 太平洋&#xff1a;太平洋是世界上最大的海洋&#xff0c;覆盖了约三分之一的地球表面。它位于亚洲、澳大利亚、美洲和南极洲之间。太平洋的面积约为1.6亿平方公里&#xff0c;拥有世界上最深的点——马里亚纳海沟。 大西洋&#xff1a;大西…

2024HW --> 安全产品 Powershell无文件落地攻击

在HW中&#xff0c;除了了解中间件&#xff0c;web漏洞&#xff0c;这些攻击的手法&#xff0c;还得了解应急响应&#xff0c;安全产品&#xff0c;入侵排查&#xff0c;溯源反制...... 那么今天&#xff0c;就来说一下安全产品&#xff08;安全公司我就不说了&#xff0c;这个…

001vscode为什么设置不了中文?

VSCode中文插件安装 在VSCode中设置中文的首要步骤是安装“Chinese (Simplified) Language Pack for Visual Studio Code”扩展插件。这一过程十分简单&#xff0c;只需打开VSCode&#xff0c;进入扩展市场&#xff0c;搜索“ Chinese (Simplified) Language Pack ”然后点击…

【MATLAB源码-第49期】基于蚁群算法(ACO)算法的栅格路径规划,输出最佳路径图和算法收敛曲线图。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 蚁群算法是一种模拟自然界蚂蚁觅食行为的启发式优化算法。在蚁群系统中&#xff0c;通过模拟蚂蚁之间通过信息素沟通的方式来寻找最短路径。 在栅格路径规划中&#xff0c;蚁群算法的基本步骤如下&#xff1a; 1. 初始化: …

MES实施优势有哪些?MES制造执行系统的主要内容

各个行业之间也开始进入到了激烈的竞争当中&#xff0c;很多企业为了能够有效提升企业竞争力&#xff0c;都会通过提升自身实力的方式来提升竞争力。一些制造业也会在经营过程当中使用到MES系统&#xff0c;那么&#xff0c;mes系统的优势有哪些呢&#xff1f; 1、优化企业现场…

mysql dump导出导入数据

前言 mysqldump是MySQL数据库中一个非常有用的命令行工具&#xff0c;用于备份和还原数据库。它可以将整个数据库或者特定的表导出为一个SQL文件&#xff0c;以便在需要时进行恢复或迁移。 使用mysqldump可以执行以下操作&#xff1a; 备份数据库&#xff1a;可以使用mysqld…