› MySQL 5.5 Community Server
› MySQL 5.6 Community Server
› Percona Configuration Wizard
› XtraBackup 搭建主从复制
Great Sites on MySQL
› Percona
› MySQL Performance Blog
› Severalnines
推荐管理工具
› Sequel Pro
› phpMyAdmin
推荐书目
› MySQL Cookbook
MySQL 相关项目
› MariaDB
› Drizzle
参考文档
› http://mysql-python.sourceforge.net/MySQLdb.html
UnAmico
V2EX  ›  MySQL

事务的原子性是由 redo log 还是 undo log 实现的?

  •  
  •   UnAmico · May 21, 2020 · 5477 views
    This topic created in 2319 days ago, the information mentioned may be changed or developed.
    1. <<MySQL 技术内幕>>中是这样的:
      redo log 用来保证事务的原子性和持久性. undo log 用来保证事务的一致性
    2. 同时我看到很多篇博客文章中是这样的:
      undo log 实现了事务的原子性

    我怎么感觉两个好像都有点道理...

    Supplement 1  ·  May 22, 2020
    补充一个问题, <<高性能 MySQL>>在说明事务的一致性概念时, 举了这样一个例子:
    在前面的例子中, 一致性确保了, 即使在执行第三、四条语句之间时系统崩溃, 支票账户中也不会损失 200 美元, 因为事务最终没有提交, 所以事务中所做的修改也不会保存到数据库中
    我怎么读都感觉这个例子是在说事务的原子性呢...
    14 replies  •  2021-04-01 17:28:42 +08:00
    wangsilence
        1
    wangsilence  
       May 21, 2020
    undo log 用来保证事务的原子性以及 InnoDB 的 MVCC,redo log 用来保证事务的持久性。
    xupefei
        2
    xupefei  
       May 21, 2020 via iPhone
    持久性和原子性有联系的。
    持久性保证断电的那一刻的 transaction 是原子的。
    sudden
        3
    sudden  
       May 21, 2020
    倾向于第一种,redo log 是二阶段提交的,有点像原子性的那种味道。当然持久性肯定是 redo log 保证的。
    xizismile
        4
    xizismile  
       May 21, 2020 via Android
    事务的 acid 四个属性关联还是挺紧密的,非要这样区分出来其实挺难区分的。。
    你记住这两种 log 的作用和 acid 四属性的意思就可以了
    UnAmico
        5
    UnAmico  
    OP
       May 22, 2020
    @wangsilence
    @xupefei
    @sudden
    @xizismile

    感谢回答, 个人思考了几遍, 感觉书还是对的:

    redo log 保证事务的持久性是没什么问题的(事务提交后, 即使数据库崩溃了也能通过 redo log 恢复),

    而 undo log 并不能保证事务的原子性, 因为事务过程中如果数据库崩溃, 还是需要通过 redo log 实现的回滚

    实际上, undo log 是数据库运行正常的情况下的事务未提交前的回滚, 因此它实现的是一致性

    这块我学的不精, 希望大家指正
    xizismile
        6
    xizismile  
       May 22, 2020 via Android
    @UnAmico 我感觉你这么想就又错了。。。我的理解是不要把这些概念混起来,还是分开的好,你知道他们都是干啥的就好了。千万不要这个 log 实现了这种属性。。这会引起争议
    xizismile
        7
    xizismile  
       May 22, 2020 via Android
    @UnAmico 你如果去看 mysql 的官方文档,你会发现,又是另一种说法。。然后你就又纠结了
    pisc
        8
    pisc  
       May 22, 2020 via Android
    在读所谓 MySQL 内幕的书之前,最好先读偏数据库原理的书,不然对很多东西的理解会有问题的,关于你的问题,实际上 undo 是可以没有的(比如 pg ),你要明白 log 机制本质上是保存 history,保存完整的 history 就可以正确 recover 。
    bugmakerxs
        9
    bugmakerxs  
       May 22, 2020
    @pisc 大佬推荐本书吧
    pisc
        10
    pisc  
       May 22, 2020 via Android
    @bugmakerxs 我当初是看《数据库系统概念》,这本书的毛病是内容太多,你可以选择性地跳过,看感兴趣的内容,比如事务部分
    louettagfh
        11
    louettagfh  
       May 22, 2020
    @UnAmico undo log 保证的事务原子性,指的不是“事务过程中如果数据库崩溃, 还是需要通过 redo log 实现的回滚”,这里指的是事务内的语句要么全部执行成功,要么全部失败. 假如事务 rollback, 需要通过 Undo log 恢复到之前版本的数据. 事务的一致性在 MySQL 中使用的是 MVCC.
    bugmakerxs
        12
    bugmakerxs  
       May 22, 2020
    @pisc 谢谢老哥
    quan7u
        13
    quan7u  
       Apr 1, 2021
    关于第一点,《内幕》后续有补充因为 redo log 缓冲和文件都是以 block 块的方式进行保存,而块大小又是与磁盘扇区大小一样,推导出 redo log 写入保证了原子性,不需要 doublewrite 技术。
    quan7u
        14
    quan7u  
       Apr 1, 2021
    我很困惑,文中提到的原子性好像与事务的原子性是不是完全对等的呢?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   952 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 45ms · UTC 18:48 · PVG 02:48 · LAX 11:48 · JFK 14:48
    ♥ Do have faith in what you're doing.