什么是acid特性_mysql事务acid解析

7次阅读

ACID 是 MySQL 事务的四大核心特性:原子性确保事务全成功或全回滚,靠 undo log 实现;一致性是原子性、隔离性、持久性与约束共同达成的状态合法;隔离性通过 MVCC 和锁控制并发可见性,默认可重复读;持久性依赖 redo log 保证已提交数据不丢失。

什么是 acid 特性_mysql 事务 acid 解析

ACID 是 MySQL 事务最核心的四个保障特性,不是功能开关,而是设计原则——它让数据库在出错、并发、断电等真实场景下,依然能守住数据的底线。

原子性:操作不能“只做一半”

事务里的所有 SQL 要么全成功,要么全回退,中间不许卡住。比如转账:从 A 扣 100 元 + 给 B 加 100 元,必须捆绑执行。哪怕第二步因网络中断失败,第一步也会被自动撤销,A 的钱不会凭空消失。

实现靠 undo log(回滚日志):每改一条记录前,先记下怎么“反向还原”。一旦需要回滚,就按日志倒着擦除变更。

  • START TRANSACTION 开启事务
  • 执行 UPDATE、INSERT 等语句
  • 出错时用 ROLLBACK 撤销全部;没问题就 COMMIT 提交

一致性:状态始终合法

这不是事务自己“保证”的结果,而是原子性、隔离性、持久性共同作用 + 数据库约束一起达成的目标。它体现为:事务前后,数据库必须满足预设规则。

例如:

  • 余额不能为负(CHECK 约束)
  • 订单必须关联真实用户(外键约束)
  • 转账总额不变(业务逻辑隐含的一致性)

如果某条 UPDATE 违反了 CHECK(amount> 0),事务会直接报错并回滚,不让非法状态写入。

隔离性:并发时不互相干扰

多个事务同时跑,彼此该“看不见”对方未提交的修改。MySQL 默认用 可重复读(REPEATABLE READ) 级别,靠 MVCC(多版本并发控制)+ 间隙锁来实现。

不同级别解决的问题:

  • 读未提交:可能读到别人还没 commit 的脏数据(脏读)
  • 读已提交:避免脏读,但同一事务两次查可能结果不同(不可重复读)
  • 可重复读:避免脏读和不可重复读,但可能看到新插入的行(幻读)
  • 串行化:彻底排队执行,避免所有问题,但性能最低

日常业务中,可重复读够用;强一致性要求(如 金融 核心账务)才考虑串行化或应用层加锁。

持久性:提交后就不会丢

COMMIT 一执行,数据就算断电、宕机、服务器重启,也必须还在磁盘上。InnoDB 靠 redo log(重做日志) 实现:先写日志再刷数据页,日志顺序写快,崩溃后靠它恢复未落盘的已提交变更。

注意:持久性针对的是已 COMMIT 的事务。没提交的,即使写进了缓冲池,崩溃后也会丢失。

不复杂,但容易忽略——ACID 不是独立存在的四个开关,而是一套协同机制。原子性兜底执行逻辑,隔离性管并发可见性,持久性保落地结果,三者合力,才撑得起“一致性”这个最终目标。

星耀云
版权声明:本站原创文章,由 星耀云 2025-12-29发表,共计1082字。
转载说明:转载本网站任何内容,请按照转载方式正确书写本站原文地址。本站提供的一切软件、教程和内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。
text=ZqhQzanResources