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

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

  •  
  •   xieyuheng ·
    xieyuheng · 2023-10-06 13:03:26 +08:00 · 2783 次点击
    这是一个创建于 412 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    16 条回复    2023-10-07 15:38:59 +08:00
    Salomea
        1
    Salomea  
       2023-10-06 13:06:30 +08:00   ❤️ 1
    或许百度一下比在这里更明了🐶
    SadBox
        2
    SadBox  
       2023-10-06 13:16:05 +08:00
    原子性 持久性 隔离性 还有个啥来着的,记不太清了
    logAn7
        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
    xieyuheng
        4
    xieyuheng  
    OP
       2023-10-06 13:23:26 +08:00
    可悲就可悲在广告语写进了教科书,并且人民不觉得那是 markting 了,而是觉得那是 “知识”。
    xieyuheng
        5
    xieyuheng  
    OP
       2023-10-06 13:25:24 +08:00   ❤️ 1
    @logAn7 还是抽象的描述。如果有例子就只有一个银行的例子。

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

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

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

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

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