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

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

相关推荐
q***81646 分钟前
MySQL:数据查询-limit
数据库·mysql
p***92487 分钟前
DBeaver连接本地MySQL、创建数据库表的基础操作
数据库·mysql
JIngJaneIL2 小时前
社区互助|社区交易|基于springboot+vue的社区互助交易系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·社区互助
晚风吹人醒.2 小时前
缓存中间件Redis安装及功能演示、企业案例
linux·数据库·redis·ubuntu·缓存·中间件
Y***98512 小时前
DVWA靶场通关——SQL Injection篇
数据库·sql
Yawesh_best2 小时前
告别系统壁垒!WSL+cpolar 让跨平台开发效率翻倍
运维·服务器·数据库·笔记·web安全
蒋士峰DBA修行之路2 小时前
实验二十八 SQL PATCH调优
数据库·sql·gaussdb
I***t7163 小时前
一条sql 在MySQL中是如何执行的
数据库·sql·mysql
一 乐3 小时前
应急知识学习|基于springboot+vue的应急知识学习系统(源码+数据库+文档)
数据库·vue.js·spring boot
vx_dmxq2113 小时前
【PHP考研互助系统】(免费领源码+演示录像)|可做计算机毕设Java、Python、PHP、小程序APP、C#、爬虫大数据、单片机、文案
java·spring boot·mysql·考研·微信小程序·小程序·php