数据库中 ACID 四个核心特性

一场银行转账事故背后的真相:ACID 四骑士的传奇

在数据库的世界里,有四位不为人知的"守护骑士",他们叫做------
原子性(Atomicity)一致性(Consistency)隔离性(Isolation)持久性(Durability)

他们共同守护着数据库的秩序,让你的转账不丢钱、下单不重扣、账本不混乱。

今天,我们就用一个"银行转账"的故事,讲清楚 ACID 是怎么让世界免于混乱的。


一、原子性:要么全做,要么全不做

某天,小明要给小红转账 100 元。

这背后其实是两步操作:

  1. 从小明账户扣 100 元。
  2. 给小红账户加 100 元。

一切看起来很简单,直到------电源断了。

如果数据库在第一步扣了钱,却来不及加到小红的账户上,那钱岂不是凭空消失?

这时候,原子性(Atomicity) 出场了:

"要么两步都完成,要么一分钱都不动!"

数据库在执行事务时,就像握着一颗"核弹"------要么全部爆发完成,要么全部撤回。

这就叫 事务要么成功提交(commit),要么回滚(rollback),中间不允许"半死不活"。

这就是原子性的意义:

💬 "All or nothing"------要么全做,要么全不做。


二、一致性:账本永远要对得上

故事继续。

假设银行规定"所有账户的余额总和必须恒定"。

如果小明的钱减少 100 元,小红的钱就必须增加 100 元。

这条规则在数据库里,就叫 一致性约束(Consistency Constraints)

如果数据库发生故障、Bug、或非法操作,导致总金额变了,那么系统就"不一致"了。

于是第二位骑士登场:

"无论发生什么,数据库都必须从一个合法状态,变到另一个合法状态。"

一致性确保数据永远遵守规则,不会出现"负数存款"、"凭空多钱"这种诡异的场景。

💬 一句话:一致性就是让数据库永远保持"自洽"。


三、隔离性:并发世界的"互不打扰"

这天,小明转账时,小红也在操作自己的账户。

假如两笔事务同时进行,没有人负责维持秩序......那就会出现灾难性的后果:

  • 两人都看到了"旧余额",重复操作;
  • 小明的钱被扣两次;
  • 小红账户显示的钱一会儿变多、一会儿变少。

混乱不堪。

这时,第三位骑士------隔离性(Isolation)------拔剑而出:

"每一笔交易都应该感觉自己是唯一运行的!"

在理想情况下(称为 可串行化 serializability ),

每个事务都像在一个独立宇宙中执行,互不干扰。

但理想太贵,现实太骨感。

完全隔离会拖慢性能,所以现代数据库通常会降低隔离级别,比如:

  • Read Uncommitted(未提交读)------最弱,可能读到别人的草稿。
  • Read Committed(已提交读)------只能看到别人已经确认的结果。
  • Repeatable Read(可重复读)------同一事务内,多次读取结果一致。
  • Serializable(可串行化)------最高级别,但最慢。

💬 隔离性是数据库的"社交距离"制度。


四、持久性:写下去,就不会忘

终于,小明转账成功,系统提示"交易完成"。

你以为故事结束了?------错!

就在这一刻,服务器断电了。

如果数据只是保存在内存中,那刚刚的交易就"消失"了,小明又要哭了。

最后一位骑士登场:持久性(Durability)

"一旦我说'成功',即使系统炸了,数据也得在我坟头上复活!"

持久性保证所有已提交的事务都会被写入磁盘、日志或副本中,哪怕系统宕机、重启,也能恢复。

在分布式系统中,这还意味着:

数据必须被复制到多个节点,哪怕一台机器坏了,也不会丢失。

💬 持久性是数据库的"记忆力"。


五、四骑士的誓言

骑士 守护目标 一句话总结
原子性 不做一半的交易 要么全做,要么全撤
一致性 维持规则不被破坏 数据总得说得通
隔离性 并发不乱 各玩各的,不互扰
持久性 成交即永久 写下去,就永远存在

这四位守护者组成了数据库的基石。

没有他们,我们的转账可能消失、订单可能重复、库存可能穿越时空。


六、ACID 的哲学:让混乱变得有序

在复杂的分布式时代,ACID 就像四个老派的武士,他们不追求速度,却保证正确性与安全

而现代互联网的"高并发世界"里,人们也在尝试用更灵活的方式,比如 BASE 原则(Basically Available, Soft state, Eventual consistency)来平衡速度与稳定。

但无论技术怎么变,ACID 的精神不会消失:

**系统必须可靠,让每一笔交易都可被信任。

相关推荐
jiayou641 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
于眠牧北1 天前
MySQL的锁类型,表锁,行锁,MVCC中所使用的临键锁
mysql
李广坤2 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
Turnip12023 天前
深度解析:为什么简单的数据库"写操作"会在 MySQL 中卡住?
后端·mysql
爱可生开源社区3 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1773 天前
《从零搭建NestJS项目》
数据库·typescript
加号34 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏4 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐4 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
百锦再4 天前
Django实现接口token检测的实现方案
数据库·python·django·sqlite·flask·fastapi·pip