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

2020-05-21 16:16:55 +08:00
 UnAmico
  1. <<MySQL 技术内幕>>中是这样的:
    redo log 用来保证事务的原子性和持久性. undo log 用来保证事务的一致性
  2. 同时我看到很多篇博客文章中是这样的:
    undo log 实现了事务的原子性

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

4121 次点击
所在节点    MySQL
14 条回复
wangsilence
2020-05-21 17:16:55 +08:00
undo log 用来保证事务的原子性以及 InnoDB 的 MVCC,redo log 用来保证事务的持久性。
xupefei
2020-05-21 18:07:06 +08:00
持久性和原子性有联系的。
持久性保证断电的那一刻的 transaction 是原子的。
sudden
2020-05-21 19:14:35 +08:00
倾向于第一种,redo log 是二阶段提交的,有点像原子性的那种味道。当然持久性肯定是 redo log 保证的。
xizismile
2020-05-21 19:56:44 +08:00
事务的 acid 四个属性关联还是挺紧密的,非要这样区分出来其实挺难区分的。。
你记住这两种 log 的作用和 acid 四属性的意思就可以了
UnAmico
2020-05-22 01:46:51 +08:00
@wangsilence
@xupefei
@sudden
@xizismile

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

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

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

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

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/674050

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX