1
ch2 2021-04-09 18:58:21 +08:00
1. 怎么知道事务只完成了半截,需要撤销?在日志里记上某年月日我开始了事务,但是发现后面没有说我把事务完成了,那么从这个地方开始所有的操作都要撤销。写进去多少改回去多少,事务意思是这一系列修改做了多少就记下来多少,以后反悔的时候看记录
2. 这句话并没有规定先后顺序,你想多了,事务实现的细节这句话并不是金科玉律 |
2
crclz 2021-04-09 19:07:37 +08:00
中国大学 MOOC 数据库系统概论 基础篇、数据库系统概论 高级篇。
|
3
zxCoder 2021-04-09 22:23:35 +08:00
建议不要看课本或者那本数据库系统概念或者楼上说的那门 mooc 的那个描述,之前我也是一直纠结在那里
可以先看一下实际的一些数据库的具体实现 |
4
Ballmer 2021-04-09 22:40:10 +08:00
|
5
leviathan0992 2021-04-09 23:52:16 +08:00
1. 虽然写下去了,依照数据库隔离级别,你依然不会读到未提交的数据.
2. 数据库为了保证事务的可串行性,不会存在你说的 "后面的事务对相同的数据项进行修改怎么办", 2PL 的加锁原则,事务 t1 在修改的 record, 但尚未 commit, 事务 t2 是无法修改该 record 的. |
6
jessehzj 2021-04-10 00:58:21 +08:00
1.事务完成不代表已经落盘,数据在内存里改好了也叫完成,数据库会在合适的时候把 buffer pool manager 的内容写到 disk(buffer pool manager 发现没有空闲页就写 /定时写 /...)
2."撤销的时候是先执行的事务先撤销"原话是啥?按理来说应该是按日志序列号从后到前 undo 的. 参考 https://15445.courses.cs.cmu.edu/fall2020/slides/21-recovery.pdf 第 57 页 |
7
NoBugDie 2021-04-12 15:04:29 +08:00
翻了一下 RocksDB 的悲观事务实现,默认隔离级别为 Read Commited
1. 在 put 时数据写入到 内存 batch,commit 时 batch 数据( WAL + data )才会写入到磁盘中 2. 在 rollback 时,仅仅需要清理内存 batch |