数据库中 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 的精神不会消失:

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

相关推荐
jyd01242 小时前
MongoDB 与 Java 实体类型 LocalTime 时区转换问题解决方案
java·数据库·mongodb
一抓掉一大把3 小时前
RuoYi .net-实现商城秒杀下单(redis,rabbitmq)
redis·mysql·c#·rabbitmq·.net
gx23483 小时前
MySQL-5-触发器和储存过程
android·mysql·adb
神奇侠20243 小时前
基于spring-boot-admin实现对应用、数据库、nginx等监控
java·数据库·nginx
行者游学3 小时前
ETCD 权限配置
数据库·etcd
Zhao_yani4 小时前
Apache Drill 连接 MySQL 或 PostgreSQL 数据库
数据库·mysql·postgresql·drill
惺忪97985 小时前
QAbstractListModel 详细解析
数据库
国服第二切图仔6 小时前
Rust开发实战之操作SQLite数据库——从零构建数据持久化应用
数据库·rust·sqlite
计算机学姐6 小时前
基于SpringBoot的高校社团管理系统【协同过滤推荐算法+数据可视化】
java·vue.js·spring boot·后端·mysql·信息可视化·推荐算法