课本上经常提到 ACID 的概念,人们也经常把 ACID 挂在嘴边。
但是课本上的介绍通常很抽象。ACID 具体是什么意思?
对于 A 、C 、I 、D 这四个属性中的每一个,具体的正面例子和反面离子分别是什么?
1
Salomea 2023-10-06 13:06:30 +08:00 1
或许百度一下比在这里更明了🐶
|
2
SadBox 2023-10-06 13:16:05 +08:00
原子性 持久性 隔离性 还有个啥来着的,记不太清了
|
3
logAn7 2023-10-06 13:19:49 +08:00 via Android
原子性( Atomicity ):事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;一致性( Consistency ):执行事务前后,数据保持一致,例如转账业务中,无论事务是否成功,转账者和收款人的总额应该是不变的;隔离性( Isolation ):并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;持久性( Durability ):一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。🌈 这里要额外补充一点:只有保证了事务的持久性、原子性、隔离性之后,一致性才能得到保障。也就是说 A 、I 、D 是手段,C 是目的!
------ 著作权归 JavaGuide(javaguide.cn)所有 基于 MIT 协议 原文链接: https://javaguide.cn/database/mysql/mysql-questions-01.html |
4
xieyuheng OP 可悲就可悲在广告语写进了教科书,并且人民不觉得那是 markting 了,而是觉得那是 “知识”。
|
5
xieyuheng OP |
6
xieyuheng OP 所谓持久性,就是数据库的定义本身吧,我写 App 的时候要用一个数据库,就是为了把数据持久化。
A 、C 、I 既然都和事务有关,可不可以说 ACID 就是,这个数据库要支持事务这个功能? 那么 couchDB 之类的,是不是就不算 ACID 的数据库? |
7
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 实现的,发生故障后可以进行恢复。 |
8
FYFX 2023-10-06 15:01:09 +08:00
ACID 的确是 markting 啊, 的确是硬凑出来的词, https://icyfenix.cn/architect-perspective/general-architecture/transaction/
|
11
dangyuluo 2023-10-06 16:14:22 +08:00 1
硬凑的几个字母而已。。英语里有个现象(德国人尤其擅长)叫 backronym ,先找一个听起来好听/好记的 4~6 字母单词,再给每个字母找对应的含义。
斯坦福有个 CARS 搞自动驾驶的研究所,全称 Center for Automotive Research at Stanford |
12
qaqLjj 2023-10-06 17:02:30 +08:00 via Android
数据库事务的 acid ,不是数据库的 acid
|
14
xenme 2023-10-06 18:10:22 +08:00 via iPhone
有没有考虑过 append only 的落盘机制?即使 append only 有些也会先 buffer 然后才落盘,成功落盘前也不一定 durable 。另外就是你举例的银行,append only 看起来很简单,但是如果有复杂的事务关联逻辑有前后顺序的时候锁等情况,append only 的数据就没那么简单了
|
16
mikewang 2023-10-07 15:38:59 +08:00 via iPhone
银行只是最易理解的一个例子,实际应用有很多,例如积分兑换。
我一同学曾经挖出图书馆积分系统的一个漏洞,通过瞬间每秒 30 次以上的高并发,就能兑换出比剩余积分更多的道具,即使系统会报出余额不足。我猜测一下就是没开事务,因此没有隔离性(缺少并发控制),也没有原子性(扣分失败时没有回滚道具发放)。 不过这个问题不在于数据库,而是开发并不知道如何正确使用 ACID 事务。ACID 可以理解为广告词,正如当年真彩色( 24bit 颜色)相比增强色( 16bit 颜色)也是广告词,但是现在已经成为了显示器的基本要求;除非有着其他特色,比如我这是个墨水屏:) |