小白关于数据库的两个问题

2021-04-09 18:38:34 +08:00
 zhuyongqi9
1.为什么数据库在系统发生故障的时候,未完成的事务可能写入到了物理数据库中呢,数据库一致性不是说未完成的事务不会提交吗,数据库什么时候才会将数据写入物理数据库,ROLLBACK 的时候是对物理数据库操作吗
2.“正向扫描日志文件 ... 同时找出故障发生时尚未完成的事务,将其事务标识记录撤销队列( UNDO LIST ),对撤销队列的各个事务进行撤销处理”请问这句话怎么理解,为什么撤销的时候是先执行的事务先撤销,如果后面的事务对相同的数据项进行修改怎么办
1557 次点击
所在节点    数据库
7 条回复
ch2
2021-04-09 18:58:21 +08:00
1. 怎么知道事务只完成了半截,需要撤销?在日志里记上某年月日我开始了事务,但是发现后面没有说我把事务完成了,那么从这个地方开始所有的操作都要撤销。写进去多少改回去多少,事务意思是这一系列修改做了多少就记下来多少,以后反悔的时候看记录
2. 这句话并没有规定先后顺序,你想多了,事务实现的细节这句话并不是金科玉律
crclz
2021-04-09 19:07:37 +08:00
中国大学 MOOC 数据库系统概论 基础篇、数据库系统概论 高级篇。
zxCoder
2021-04-09 22:23:35 +08:00
建议不要看课本或者那本数据库系统概念或者楼上说的那门 mooc 的那个描述,之前我也是一直纠结在那里

可以先看一下实际的一些数据库的具体实现
Ballmer
2021-04-09 22:40:10 +08:00
leviathan0992
2021-04-09 23:52:16 +08:00
1. 虽然写下去了,依照数据库隔离级别,你依然不会读到未提交的数据.

2. 数据库为了保证事务的可串行性,不会存在你说的 "后面的事务对相同的数据项进行修改怎么办", 2PL 的加锁原则,事务 t1 在修改的 record, 但尚未 commit, 事务 t2 是无法修改该 record 的.
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 页
NoBugDie
2021-04-12 15:04:29 +08:00
翻了一下 RocksDB 的悲观事务实现,默认隔离级别为 Read Commited
1. 在 put 时数据写入到 内存 batch,commit 时 batch 数据( WAL + data )才会写入到磁盘中
2. 在 rollback 时,仅仅需要清理内存 batch

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

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

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

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

© 2021 V2EX