redo log 用来保证事务的原子性和持久性. undo log 用来保证事务的一致性
undo log 实现了事务的原子性
我怎么感觉两个好像都有点道理...
1
wangsilence 2020-05-21 17:16:55 +08:00
undo log 用来保证事务的原子性以及 InnoDB 的 MVCC,redo log 用来保证事务的持久性。
|
2
xupefei 2020-05-21 18:07:06 +08:00 via iPhone
持久性和原子性有联系的。
持久性保证断电的那一刻的 transaction 是原子的。 |
3
sudden 2020-05-21 19:14:35 +08:00
倾向于第一种,redo log 是二阶段提交的,有点像原子性的那种味道。当然持久性肯定是 redo log 保证的。
|
4
xizismile 2020-05-21 19:56:44 +08:00 via Android
事务的 acid 四个属性关联还是挺紧密的,非要这样区分出来其实挺难区分的。。
你记住这两种 log 的作用和 acid 四属性的意思就可以了 |
5
UnAmico OP @wangsilence
@xupefei @sudden @xizismile 感谢回答, 个人思考了几遍, 感觉书还是对的: redo log 保证事务的持久性是没什么问题的(事务提交后, 即使数据库崩溃了也能通过 redo log 恢复), 而 undo log 并不能保证事务的原子性, 因为事务过程中如果数据库崩溃, 还是需要通过 redo log 实现的回滚 实际上, undo log 是数据库运行正常的情况下的事务未提交前的回滚, 因此它实现的是一致性 这块我学的不精, 希望大家指正 |
6
xizismile 2020-05-22 08:29:01 +08:00 via Android
@UnAmico 我感觉你这么想就又错了。。。我的理解是不要把这些概念混起来,还是分开的好,你知道他们都是干啥的就好了。千万不要这个 log 实现了这种属性。。这会引起争议
|
7
xizismile 2020-05-22 08:29:56 +08:00 via Android
@UnAmico 你如果去看 mysql 的官方文档,你会发现,又是另一种说法。。然后你就又纠结了
|
8
pisc 2020-05-22 09:07:40 +08:00 via Android
在读所谓 MySQL 内幕的书之前,最好先读偏数据库原理的书,不然对很多东西的理解会有问题的,关于你的问题,实际上 undo 是可以没有的(比如 pg ),你要明白 log 机制本质上是保存 history,保存完整的 history 就可以正确 recover 。
|
9
bugmakerxs 2020-05-22 09:49:35 +08:00
@pisc 大佬推荐本书吧
|
10
pisc 2020-05-22 10:08:20 +08:00 via Android
@bugmakerxs 我当初是看《数据库系统概念》,这本书的毛病是内容太多,你可以选择性地跳过,看感兴趣的内容,比如事务部分
|
11
louettagfh 2020-05-22 11:22:02 +08:00
@UnAmico undo log 保证的事务原子性,指的不是“事务过程中如果数据库崩溃, 还是需要通过 redo log 实现的回滚”,这里指的是事务内的语句要么全部执行成功,要么全部失败. 假如事务 rollback, 需要通过 Undo log 恢复到之前版本的数据. 事务的一致性在 MySQL 中使用的是 MVCC.
|
12
bugmakerxs 2020-05-22 23:13:06 +08:00
@pisc 谢谢老哥
|
13
quan7u 2021-04-01 17:26:45 +08:00
关于第一点,《内幕》后续有补充因为 redo log 缓冲和文件都是以 block 块的方式进行保存,而块大小又是与磁盘扇区大小一样,推导出 redo log 写入保证了原子性,不需要 doublewrite 技术。
|
14
quan7u 2021-04-01 17:28:42 +08:00
我很困惑,文中提到的原子性好像与事务的原子性是不是完全对等的呢?
|