数据库管理系统(DBMS)的事务四大特性(ACID)以及事务的四种隔离级别

news2024/12/27 15:22:28

一、什么是ACID?

在这里插入图片描述

ACID是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability) 的缩写,是在可靠数据库管理系统(DBMS)中,事务(transaction)所应该具有的四个特性。

原子性(Atomicity): 原子性意味着事务是一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚。这意味着事务中的操作如果失败,将回滚到事务开始之前的状态,以确保数据的一致性。在MySQL中,通过支持事务的提交和回滚来实现原子性。

一致性(Consistency): 一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态。一致性状态的含义在于,如果事务开始之前和结束之后数据库处于一致性状态,那么这个事务就是正确的。例如,在银行转账的例子中,一致性确保了即使在执行第三、四条语句之间时系统崩溃,信用卡账号也不会损失100块,因为事务最终没有提交,所以事务中所做的修改也不会保存到数据库中,保证数据一致性。

隔离性(Isolation): 隔离性意味着多个事务并发执行时,一个事务的执行不影响其他事务的执行。在MySQL中,通过使用事务的隔离级别来实现隔离性。例如,使用读未提交(Read Uncommitted)、读提交(Read Committed)、可重复读(Repeatable Read)或串行化(Serializable)等隔离级别,可以避免多个事务并发执行时的相互干扰。

持久性(Durability): 持久性意味着一旦事务提交,则其所做的修改就会永久保存到数据库中,之后的其他操作或故障都不会对事务的结果产生影响。在MySQL中,通过将数据写入磁盘以及使用日志文件来实现持久性。

总的来说,理解ACID四大特性对于理解数据库事务的工作原理和正确使用数据库至关重要。

二、MySQL支持四种事务隔离级别

这些隔离级别是通过SQL标准定义的,包括:

读未提交(Read Uncommitted): 这是事务隔离级别的最低级别,这种隔离级别下,一个事务可以看到其他未提交事务的变动。这种级别可以导致很多问题,如脏读(Dirty Read),即一个事务读取了另一个未提交事务的数据,然后该事务回滚,那么第一个事务获取的数据就是无效的。
eg:事务A可能读取到事务B修改过但未提交的数据,可能发生脏读,不可重复读和幻读的问题。

读已提交(Read Committed): 这是大多数数据库系统的默认隔离级别(MySQL默认的隔离级别是可重复读(Repeatable Read)),它只保证了一个事务只能看到其他事务已经提交的变动。这种隔离级别解决了脏读问题,但是可能会出现不可重复读(Non-repeatable Read)的问题,即在同一事务中,多次读取同一数据返回的结果有所不同,一个事务读取了另一个事务已经提交的变动。
eg:事务B只能在事务A修改过并且已提交后才能取到到事务B修改的数据。读已提交隔离级别解决了脏读的问题,但可能发生不可重复读和幻读的问题

可重复读(Repeatable Read): 这是MySQL数据库的默认隔离级别。在这个级别下,同一事务中多次读取同一数据会返回相同的结果,除非数据被本事务自己改变。这种隔离级别可以解决不可重复读的问题,但是还可能会产生幻读(Phantom Read)的问题,即在一个事务内部无法看到其他其他事务插入的新纪录。
eg:事务B只能在事务A修改过数据并提交后,自己也提交事务后,才能读取到事务B修改的数据。可重复读隔离解决了脏读和不可重复读的问题,但可能发生幻读问题。

串行化(序列化)(Serializable): 这是最高的事务隔离级别。在这个级别,事务串行化顺序执行,可以避免脏读、不可重复读与幻读的问题,但是这种隔离级别效率低下,因为事务通常需要等待前一个事务完成,才能继续执行。主要通过强制事务排序来解决幻读问题。简单来说,就是在每个读取的数据行上加上共享锁实现,这样就避免了脏读、不可重复读和幻读等问题。但是该事务隔离级别执行效率低下,且性能开销也最大,所以一般情况下不推荐使用。

需要注意的是,这些隔离级别在解决某些问题时可能会引入新的问题。例如,可重复读解决了不可重复读的问题,但又可能引入幻读的问题。因此,选择何种事务隔离级别需要权衡各种可能出现的并发问题。

拓展:

脏读: 脏读是指一个事务正在访问数据,并且对数据进行了修改,但是这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
不可重复读: 在这个事务还没有结束时,另外一个事务也访问了该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。
幻读: 幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。

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

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

相关文章

苹果微信聊天记录删除了怎么恢复?果粉原来是这样恢复的

粗心大意删除了微信聊天记录?有时候,一些小伙伴可能只是想要删除一部分聊天记录,但是在进行批量删除时,不小心勾选到了很重要的对话,从而导致记录丢失。 如果这时想找回聊天记录该怎么办?微信聊天记录删除…

185页智慧校园顶层架构及建设方案 WORD

本资料来源公开网络,仅供个人学习,请勿商用,如有侵权请联系删除,更多浏览公众号:智慧方案文库。目录 一、 项目概述 1.1 建设背景 1.2 建设现状 1.3 总体目标 二、 总体规划设计 2.1 智慧校园网系统 2.1.…

Python程序设计基础:异常

文章目录 一、异常的类型二、异常的处理过程 一、异常的类型 在使用Python进行程序编写时,很容易就遇到程序出错的情况,可能是引用了未定义的变量,也可能是访问了字典中不存在的键,还可能是读文件时,只读模式下读取了…

【Sentinel】降级源码:插槽DegradeSlot与断路器的实现

文章目录 1、实现原理2、DegradeSlot类3、CircuitBreaker4、触发断路器 1、实现原理 Sentinel的降级是基于状态机来实现的: 2、DegradeSlot类 熔断降级的逻辑在DegradeSlot类中实现,核心API: Override public void entry(Context context,…

数字化企业可能会用到哪些系统?

数字企业依靠各种软件系统来驱动其运营、增强客户体验并实现其业务目标。这些系统可能会根据企业、行业的性质和具体目标的不同而有很大差异。以下是数字化企业使用的一些常见的软件系统类型: 1.企业资源规划 (ERP) 系统: ERP 系统集成了财务、人力资源…

【Dots之009】WriteGroup

一、WriteGroup基础知识 WriteGroup是一个属性标签,在ECS的代码中可以用于修饰组件; 格式如下: [WriteGroup(typeof(T))]那么接下来看几段代码进行理解; 1、定义几个组件 struct ScaleComponentData : IComponentData {publi…

日流量200亿,携程网关的架构设计

说在前面 在40岁老架构师 尼恩的读者社区(50)中,很多小伙伴拿到一线互联网企业如阿里、网易、有赞、希音、百度、滴滴的面试资格。 就在昨天,尼恩指导一个小伙伴简历,写了一个《高并发 Netty网关项目》,此项目帮这个小伙拿到 字…

电脑c盘变红满了怎么清理?4个方法轻松清理!

“我的电脑才用了不到一年,现在就已经满了!电脑c盘变红满了应该怎么清理呢?有什么方法能帮我清理的干净一点吗?希望大家给我出出主意。” 随着我们使用电脑时间的增多,电脑C盘可能会变得满满当当,这会不仅会…

失效的访问控制及漏洞复现

失效的访问控制(越权) 1. 失效的访问控制(越权) 1.1 OWASP TOP10 1.1.1 A5:2017-Broken Access Control 未对通过身份验证的用户实施恰当的访问控制。攻击者可以利用这些缺陷访问未经授权的功能或数据,例如:访问其他用户的帐户、查看敏感文件、修改其…

高速信号应如何走线?这些规则千万别走错

提起高速信号的设计与布线,可能很多工程师都能头头是道,但放在实际设计中却大部分不可行,这篇文章将向电子工程师介绍一些关键规则,确保在电路板上传输高速信号时获得最佳性能,注意这些规则千万别走错! 1、…

Java后端开发面试题——JVM虚拟机篇

目录 什么是程序计数器? 你能给我详细的介绍Java堆吗? 什么是虚拟机栈 1. 垃圾回收是否涉及栈内存? 2. 栈内存分配越大越好吗? 3. 方法内的局部变量是否线程安全? 4.什么情况下会导致栈内存溢出? 5.堆栈的区别…

Weblogic SSRF【漏洞复现】

文章目录 漏洞测试注入HTTP头,利用Redis反弹shell redis不能启动问题解决 Path : vulhub/weblogic/ssrf 编译及启动测试环境 docker compose up -dWeblogic中存在一个SSRF漏洞,利用该漏洞可以发送任意HTTP请求,进而攻击内网中redis、fastcgi…

Unity设置TextMeshPro文本超出范围显示...

TextMtshPro文本超出范围,展示省略。选择Overflow为Ellipsis。

链表的中间节点(每日一题)

“路虽远,行则将至” ❤️主页:小赛毛 ☕今日份刷题:移除链表元素 题目描述: 给你单链表的头结点 head ,请你找出并返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。 示例1: 输入&#…

AI数据标注迈入自动化时代,26年老兵掘金全球智能汽车市场

4D数据标注,掀起了业界新风向。 一是以BEV为代表的感知技术,输出的空间从2D透视图像转换到了3D空间+时序维度,4D标注应运而生;二是4D标注借助点云级别或object级别的重建,通过人工标注积累原始数据&#x…

Calico BGP通信分析

Calico BGP通信分析 BGP网络模型 BGP网络相比较IPIP网络,最大的不同之处就是没有隧道设备tunl0,pod之间的流量直接从宿主机通过arp下一跳到目的地宿主机,减少了tunl0环节 BGP两种模式: 全互联模式(node-to-node mesh)——全互联…

批量采集的时间管理与优化

在进行大规模数据采集时,如何合理安排和管理爬取任务的时间成为了每个专业程序员需要面对的挑战。本文将分享一些关于批量采集中时间管理和优化方面的实用技巧,帮助你提升爬虫工作效率。 1. 制定明确目标并设置合适频率 首先要明确自己所需获取数据的范…

陇剑杯2023WriteUp学习笔记【初赛】

文章目录 数据分析1、hard_webhard_web_1hard_web_2hard_web_3 2、sevrer savesevrer save_1sevrer save_2sevrer save_3sevrer save_4sevrer save_5sevrer save_6sevrer save_7sevrer save_8 3、WiresharkWireshark1_1Wireshark1_2Wireshark1_3Wireshark1_4 4、Incidentrespon…

C++信息学奥赛1187:统计字符数

#include <bits/stdc.h> using namespace std; int main() {string arr;cin >> arr; // 输入一个字符串int n, a, max; // 定义变量n, a, maxchar ArrMax; // 定义字符变量ArrMaxn arr.length(); // 获取字符串长度max a 0; // 初始化max和a为0// 外层循环&…

GPT引领前沿与应用突破之GPT4科研实践技术与AI绘图教程

详情点击链接&#xff1a;GPT引领前沿与应用突破之GPT4科研实践技术与AI绘图教程 前沿 GPT对于每个科研人员已经成为不可或缺的辅助工具&#xff0c;不同的研究领域和项目具有不同的需求。如在科研编程、绘图领域&#xff1a;1、编程建议和示例代码: 无论你使用的编程语言是Py…