V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
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 · 2020-05-21 16:16:55 +08:00 · 4082 次点击
    这是一个创建于 1407 天前的主题,其中的信息可能已经有所发展或是发生改变。
    1. <<MySQL 技术内幕>>中是这样的:
      redo log 用来保证事务的原子性和持久性. undo log 用来保证事务的一致性
    2. 同时我看到很多篇博客文章中是这样的:
      undo log 实现了事务的原子性

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

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

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

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

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

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

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