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

zhuyongqi9 29天前 21

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

    可以先看一下实际的一些数据库的具体实现
  • Ballmer 19天前
    引用 5
    极客时间 MYSQL 45 讲,也可以看看这个,具体有讲

    https://time.geekbang.org/column/intro/139?tab=catalog&code=diIl3Av7In7p-TmrXqDVZ3CuXDaXfqJR4Ey-HR7L5tw%3D&utm_term=SPoster
  • leviathan0992 19天前
    引用 6
    1. 虽然写下去了,依照数据库隔离级别,你依然不会读到未提交的数据.

    2. 数据库为了保证事务的可串行性,不会存在你说的 "后面的事务对相同的数据项进行修改怎么办", 2PL 的加锁原则,事务 t1 在修改的 record, 但尚未 commit, 事务 t2 是无法修改该 record 的.
  • jessehzj 19天前
    引用 7
    1.事务完成不代表已经落盘,数据在内存里改好了也叫完成,数据库会在合适的时候把 buffer pool manager 的内容写到 disk(buffer pool manager 发现没有空闲页就写 /定时写 /...)
    2."撤销的时候是先执行的事务先撤销"原话是啥?按理来说应该是按日志序列号从后到前 undo 的.
    参考 https://15445.courses.cs.cmu.edu/fall2020/slides/21-recovery.pdf 第 57 页
  • NoBugDie 19天前
    引用 8
    翻了一下 RocksDB 的悲观事务实现,默认隔离级别为 Read Commited
    1. 在 put 时数据写入到 内存 batch,commit 时 batch 数据( WAL + data )才会写入到磁盘中
    2. 在 rollback 时,仅仅需要清理内存 batch
  • 游客
    9
返回