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

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

相关推荐
锋君14 分钟前
Orcale数据库在Asp.Net Core环境下使用EF Core 生成实体
数据库·后端·oracle·asp.net
啊吧怪不啊吧15 分钟前
SQL之用户管理——权限与用户
大数据·数据库·sql
VX:Fegn089516 分钟前
计算机毕业设计|基于springboot + vue电影院购票管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
ZePingPingZe17 分钟前
MySQL与Spring,事务与自动提交有什么关系?
mysql·spring
q_191328469519 分钟前
基于SpringBoot2+Vue2的企业合作与活动管理平台
java·vue.js·经验分享·spring boot·笔记·mysql·计算机毕业设计
凌冰_19 分钟前
JAVA与MySQL实现银行管理系统
java·开发语言·mysql
NineData21 分钟前
NineData 数据库 DevOps 正式支持谷歌云,全面接入 GCP 数据源
运维·数据库·devops·ninedata·gcp·玖章算术·数据智能管理平台
韩立学长27 分钟前
Springboot考研自习室预约管理系统1wdeuxh6(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
2503_9284115631 分钟前
12.18 中后台项目-权限管理
前端·javascript·数据库
北友舰长2 小时前
基于Springboot+thymeleaf图书管理系统的设计与实现【Java毕业设计·安装调试·代码讲解】
java·spring boot·mysql·课程设计·图书管理·b/s·图书