V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhuyongqi9
V2EX  ›  数据库

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

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

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

    2. 数据库为了保证事务的可串行性,不会存在你说的 "后面的事务对相同的数据项进行修改怎么办", 2PL 的加锁原则,事务 t1 在修改的 record, 但尚未 commit, 事务 t2 是无法修改该 record 的.
    jessehzj
        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 页
    NoBugDie
        7
    NoBugDie  
       2021-04-12 15:04:29 +08:00
    翻了一下 RocksDB 的悲观事务实现,默认隔离级别为 Read Commited
    1. 在 put 时数据写入到 内存 batch,commit 时 batch 数据( WAL + data )才会写入到磁盘中
    2. 在 rollback 时,仅仅需要清理内存 batch
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1348 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 23:49 · PVG 07:49 · LAX 15:49 · JFK 18:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.