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

MySQL的ACID特性

MySQL为保证事务(transaction)是正确可靠的,具备以下四个特性:

原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

一、原子性(Atomicity)

一个事务中的所有操作要么全部成功执行,要么全部失败回滚。就像一个不可分割的原子一样。

例如,在银行转账操作中,从账户 A 向账户 B 转账 100 元,这个事务包含两个操作:从账户 A 扣除 100 元,向账户 B 增加 100 元。如果在执行过程中,向账户 B 增加 100 元的操作失败了,那么整个事务将回滚,账户 A 也不会扣除 100 元。

二、一致性(Consistency)

一致性是指数据库中的数据在任何时候都满足预定的完整性约束条件。也就是说,数据库中的数据必须是正确的、符合业务规则的,并且在所有相关操作执行后仍然保持这种正确性。

例如,在一个银行转账系统中,一致性要求转账操作完成后,转出账户的余额减少的金额必须等于转入账户余额增加的金额,同时相关的账户信息、交易记录等都要准确无误地更新,以反映出这一转账操作的结果,确保数据在整体上是一致的、符合业务逻辑的。

三、隔离性(Isolation)

隔离性是指多个事务并发执行时,每个事务都感觉不到其他事务的存在,就好像在单独执行一样。MySQL 提供了多种隔离级别来控制事务之间的相互影响。

1.读未提交(Read Uncommitted)

定义:一个事务可以读取另一个未提交事务的数据

优点:并发性能最高,因为没有任何锁机制

缺点:会出现脏读问题(读取到其他事务未提交的数据,如果该事务回滚,那么读取到的数据就是无效的)

示例:事务A修改了数据但未提交,事务B此时读取到了事务A修改后的数据,如果事务 A 回滚,事务B 读取到的数据就是脏数据

2.读已提交(Read Committed)

定义:一个事务只能读取另一个已提交事务的数据

优点:解决了脏读问题

缺点:会出现不可重复读问题(在同一个事务内,多次读取同一数据,可能会得到不同的结果,因为在两次读取之间,其他事务可能已经修改并提交了该数据)

示例:事务A第一次读取数据后,事务B修改并提交了该数据,事务A再次读取时,得到的数据和第一次不同

3.可重复读(Repeatable Read)

定义:在同一个事务内,多次读取同一数据,结果始终保持一致,即使其他事务对该数据进行了修改并提交

优点:解决了不可重复读问题

缺点:会出现幻读问题(当一个事务按相同条件多次查询,可能会得到不同数量的记录,因为在两次查询之间,其他事务可能插入或删除了符合条件的记录)

示例:事务A第一次查询符合条件的记录有5条,事务B插入了一条符合条件的记录并提交,事务A再次查询时,得到的记录变为6条

4.串行化(Serializable)

定义:所有事务依次执行,完全串行化,避免了所有并发问题

优点:数据一致性最高

缺点:并发性能最低,因为每个事务都需要等待前一个事务完成才能执行

示例:事务A执行时,事务 B必须等待事务A完成后才能开始执行

四、持久性(Durability)

持久性确保一旦事务被提交,其对数据库所做的更改就会永久保存下来,即使系统发生故障(如停电、系统崩溃等),这些更改也不会丢失。

例如,当用户向数据库中插入一条记录并成功提交后,无论之后发生什么情况,这条记录都应该能够在数据库中被找到,不会因为系统的意外重启或其他故障而消失。

http://www.xdnf.cn/news/69517.html

相关文章:

  • 抽象类的特点
  • 面经-浏览器/网络/HTML/CSS
  • 单页面应用的特点,什么是路由,VueRouter的下载,安装和使用,路由的封装抽离,声明式导航的介绍和使用
  • 数据结构之二叉树
  • 线性回归之多项式升维
  • TDengine 存储引擎设计
  • map和set的使用
  • PHP日志会对服务器产生哪些影响?
  • 安恒安全渗透面试题
  • [PTA]2025 CCCC-GPLT天梯赛-这不是字符串题
  • 29-JavaScript基础语法(函数)
  • JavaScript 中的单例模式
  • AI Agent开发第34课-用最先进的图片向量BGE-VL实现“图搜图”-下
  • C# 的 字符串插值($) 和 逐字字符串(@) 功能
  • 高效Java面试题(附答案)
  • 鸿蒙系统的 “成长烦恼“:生态突围与技术迭代的双重挑战
  • KRaft面试思路引导
  • Linux环境准备(安装VirtualBox和Ubuntu,安装MySQL,MySQL启动、重启和停止)
  • promise.resolve,promise.reject,promise.all的理解和运用
  • Java 性能优化:从硬件到软件的全方位思考
  • 深入解析 Python 函数:从基础到进阶
  • Python利用shp文件裁剪netcdf文件
  • Linux-scp命令
  • 高尔夫球规则及打法·棒球1号位
  • 软件模块设计质量之内聚
  • 大模型AI的运行逻辑与准确性保障机制——以DeepSeek与豆包为例
  • 当socket的状态为SOCK_SYNSENT时,不可能同时存在Sn_IR_TIMEOUT中断标志被置位的情况
  • 基于SpringBoot的高校体育馆场地预约管理系统-项目分享
  • jinjia2将后端传至前端的字典变量转换为JS变量
  • 使用 Flutter 遇坑小计