请问人们常说的数据库的 ACID 究竟是什么意思?

2023-10-06 13:03:26 +08:00
 xieyuheng

课本上经常提到 ACID 的概念,人们也经常把 ACID 挂在嘴边。

但是课本上的介绍通常很抽象。ACID 具体是什么意思?

对于 A 、C 、I 、D 这四个属性中的每一个,具体的正面例子和反面离子分别是什么?

2833 次点击
所在节点    程序员
16 条回复
Salomea
2023-10-06 13:06:30 +08:00
或许百度一下比在这里更明了🐶
SadBox
2023-10-06 13:16:05 +08:00
原子性 持久性 隔离性 还有个啥来着的,记不太清了
logAn7
2023-10-06 13:19:49 +08:00
原子性( Atomicity ):事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;一致性( Consistency ):执行事务前后,数据保持一致,例如转账业务中,无论事务是否成功,转账者和收款人的总额应该是不变的;隔离性( Isolation ):并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;持久性( Durability ):一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。🌈 这里要额外补充一点:只有保证了事务的持久性、原子性、隔离性之后,一致性才能得到保障。也就是说 A 、I 、D 是手段,C 是目的!
------
著作权归 JavaGuide(javaguide.cn)所有
基于 MIT 协议
原文链接: https://javaguide.cn/database/mysql/mysql-questions-01.html
xieyuheng
2023-10-06 13:23:26 +08:00
可悲就可悲在广告语写进了教科书,并且人民不觉得那是 markting 了,而是觉得那是 “知识”。
xieyuheng
2023-10-06 13:25:24 +08:00
@logAn7 还是抽象的描述。如果有例子就只有一个银行的例子。

可知道银行用的是 appending only 账本?
跟“两次修改要在同一个事务中”没有任何关系。
xieyuheng
2023-10-06 13:29:13 +08:00
所谓持久性,就是数据库的定义本身吧,我写 App 的时候要用一个数据库,就是为了把数据持久化。

A 、C 、I 既然都和事务有关,可不可以说 ACID 就是,这个数据库要支持事务这个功能?

那么 couchDB 之类的,是不是就不算 ACID 的数据库?
PTLin
2023-10-06 13:52:02 +08:00
个人认为 MySQL 里,Atomicity 是由 redo log 以及 undo log 实现的:redo log 和 Mini Transaction 可以保证执行一条语句再恢复后数据库整体的状态不会是不一致的,undo log 可以保证 redo log 恢复后把未提交的事务重新回滚。

Consistency 是数据库对显示世界建模的正确性的概念,很多时候需要再代码段实现一致性。

Isolation 是由 undo log 以及锁,间隔锁,MVCC 实现的,锁做到了基础的隔离实现。undo log 为基础的 MVCC 的 readview 保证了实现隔离性下的并发性。

Durability 是由 redo log 以及 undo log 实现的,发生故障后可以进行恢复。
FYFX
2023-10-06 15:01:09 +08:00
ACID 的确是 markting 啊, 的确是硬凑出来的词, https://icyfenix.cn/architect-perspective/general-architecture/transaction/
xieyuheng
2023-10-06 15:35:33 +08:00
@FYFX 原来如此!
Euthpic
2023-10-06 16:06:08 +08:00
@FYFX c 是目的,aid 是手段,我之前的观点也是这样
dangyuluo
2023-10-06 16:14:22 +08:00
硬凑的几个字母而已。。英语里有个现象(德国人尤其擅长)叫 backronym ,先找一个听起来好听/好记的 4~6 字母单词,再给每个字母找对应的含义。
斯坦福有个 CARS 搞自动驾驶的研究所,全称 Center for Automotive Research at Stanford
qaqLjj
2023-10-06 17:02:30 +08:00
数据库事务的 acid ,不是数据库的 acid
me1onsoda
2023-10-06 17:35:47 +08:00
@xieyuheng 你的意思是在 append only 这个模式下,不需要事务也能保证数据正常?
xenme
2023-10-06 18:10:22 +08:00
有没有考虑过 append only 的落盘机制?即使 append only 有些也会先 buffer 然后才落盘,成功落盘前也不一定 durable 。另外就是你举例的银行,append only 看起来很简单,但是如果有复杂的事务关联逻辑有前后顺序的时候锁等情况,append only 的数据就没那么简单了
xieyuheng
2023-10-06 19:06:33 +08:00
@me1onsoda 对的。
mikewang
2023-10-07 15:38:59 +08:00
银行只是最易理解的一个例子,实际应用有很多,例如积分兑换。

我一同学曾经挖出图书馆积分系统的一个漏洞,通过瞬间每秒 30 次以上的高并发,就能兑换出比剩余积分更多的道具,即使系统会报出余额不足。我猜测一下就是没开事务,因此没有隔离性(缺少并发控制),也没有原子性(扣分失败时没有回滚道具发放)。

不过这个问题不在于数据库,而是开发并不知道如何正确使用 ACID 事务。ACID 可以理解为广告词,正如当年真彩色( 24bit 颜色)相比增强色( 16bit 颜色)也是广告词,但是现在已经成为了显示器的基本要求;除非有着其他特色,比如我这是个墨水屏:)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/979186

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX