This topic created in 1887 days ago, the information mentioned may be changed or developed.
1.为什么数据库在系统发生故障的时候,未完成的事务可能写入到了物理数据库中呢,数据库一致性不是说未完成的事务不会提交吗,数据库什么时候才会将数据写入物理数据库,ROLLBACK 的时候是对物理数据库操作吗
2.“正向扫描日志文件 ... 同时找出故障发生时尚未完成的事务,将其事务标识记录撤销队列( UNDO LIST ),对撤销队列的各个事务进行撤销处理”请问这句话怎么理解,为什么撤销的时候是先执行的事务先撤销,如果后面的事务对相同的数据项进行修改怎么办
7 replies • 2021-04-12 15:04:29 +08:00
 |
|
1
ch2 Apr 9, 2021
1. 怎么知道事务只完成了半截,需要撤销?在日志里记上某年月日我开始了事务,但是发现后面没有说我把事务完成了,那么从这个地方开始所有的操作都要撤销。写进去多少改回去多少,事务意思是这一系列修改做了多少就记下来多少,以后反悔的时候看记录 2. 这句话并没有规定先后顺序,你想多了,事务实现的细节这句话并不是金科玉律
|
 |
|
2
crclz Apr 9, 2021
中国大学 MOOC 数据库系统概论 基础篇、数据库系统概论 高级篇。
|
 |
|
3
zxCoder Apr 9, 2021
建议不要看课本或者那本数据库系统概念或者楼上说的那门 mooc 的那个描述,之前我也是一直纠结在那里
可以先看一下实际的一些数据库的具体实现
|
 |
|
5
leviathan0992 Apr 9, 2021
1. 虽然写下去了,依照数据库隔离级别,你依然不会读到未提交的数据.
2. 数据库为了保证事务的可串行性,不会存在你说的 "后面的事务对相同的数据项进行修改怎么办", 2PL 的加锁原则,事务 t1 在修改的 record, 但尚未 commit, 事务 t2 是无法修改该 record 的.
|
 |
|
7
NoBugDie Apr 12, 2021
翻了一下 RocksDB 的悲观事务实现,默认隔离级别为 Read Commited 1. 在 put 时数据写入到 内存 batch,commit 时 batch 数据( WAL + data )才会写入到磁盘中 2. 在 rollback 时,仅仅需要清理内存 batch
|