V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xieyuheng
V2EX  ›  程序员

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

  •  
  •   xieyuheng ·
    xieyuheng · 204 天前 · 2535 次点击
    这是一个创建于 204 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    可知道银行用的是 appending only 账本?
    跟“两次修改要在同一个事务中”没有任何关系。
    xieyuheng
        6
    xieyuheng  
    OP
       204 天前
    所谓持久性,就是数据库的定义本身吧,我写 App 的时候要用一个数据库,就是为了把数据持久化。

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

    那么 couchDB 之类的,是不是就不算 ACID 的数据库?
    PTLin
        7
    PTLin  
       204 天前
    个人认为 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
        8
    FYFX  
       204 天前
    ACID 的确是 markting 啊, 的确是硬凑出来的词, https://icyfenix.cn/architect-perspective/general-architecture/transaction/
    xieyuheng
        9
    xieyuheng  
    OP
       204 天前
    @FYFX 原来如此!
    Euthpic
        10
    Euthpic  
       204 天前 via Android
    @FYFX c 是目的,aid 是手段,我之前的观点也是这样
    dangyuluo
        11
    dangyuluo  
       204 天前   ❤️ 1
    硬凑的几个字母而已。。英语里有个现象(德国人尤其擅长)叫 backronym ,先找一个听起来好听/好记的 4~6 字母单词,再给每个字母找对应的含义。
    斯坦福有个 CARS 搞自动驾驶的研究所,全称 Center for Automotive Research at Stanford
    qaqLjj
        12
    qaqLjj  
       204 天前 via Android
    数据库事务的 acid ,不是数据库的 acid
    me1onsoda
        13
    me1onsoda  
       204 天前
    @xieyuheng 你的意思是在 append only 这个模式下,不需要事务也能保证数据正常?
    xenme
        14
    xenme  
       204 天前 via iPhone
    有没有考虑过 append only 的落盘机制?即使 append only 有些也会先 buffer 然后才落盘,成功落盘前也不一定 durable 。另外就是你举例的银行,append only 看起来很简单,但是如果有复杂的事务关联逻辑有前后顺序的时候锁等情况,append only 的数据就没那么简单了
    xieyuheng
        15
    xieyuheng  
    OP
       204 天前
    @me1onsoda 对的。
    mikewang
        16
    mikewang  
       203 天前 via iPhone
    银行只是最易理解的一个例子,实际应用有很多,例如积分兑换。

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

    不过这个问题不在于数据库,而是开发并不知道如何正确使用 ACID 事务。ACID 可以理解为广告词,正如当年真彩色( 24bit 颜色)相比增强色( 16bit 颜色)也是广告词,但是现在已经成为了显示器的基本要求;除非有着其他特色,比如我这是个墨水屏:)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1481 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 16:56 · PVG 00:56 · LAX 09:56 · JFK 12:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.