美文网首页
8.2 快照读,当前读

8.2 快照读,当前读

作者: 胖达_4b7e | 来源:发表于2019-02-22 00:04 被阅读0次

    当前读

    这些是当前读:

    select...lock in share mode (就这个是共享锁)
    select...for update
    update , delete , insert

    当前读, 就是加了锁
    读取的是最新版本, 并且对读取的记录加锁, 不让其他事务同时去改(其他事务要阻塞下)


    update执行过程,insert和delete也一样

    快照读:

    普通select时是,
    基于提升并发的考虑,
    基于MVCC多版本并发控制(行锁的变种)
    改进成不加锁了(除非是隔离级别是串行),
    读的是视图, 不是最新数据

    如果先select 再update 可能会看到幻行, 因为select读的可能是老的版本, 有其他事务插入或者删除过行,所以和更新读到的最新版本行数不一样

    读已提交

    select (快照读)
    select...lock in share mode(当前读)
    结果是一样的
    因为快照读, 采纳的是这之前提交的最后版本
    当前读 是读的最新版本
    是同一版本

    重复读

    select (快照读): 快照读的版本
    select...lock in share mode(当前读) : 最新版本
    结果可能不同, 后者可能更新
    即使有过当前读, 再快照读, 也还是读快照

    undo log:

    每行除了数据外 还有
    DB_TRX_ID: 最后更新的事务id(update,delete,insert)
    DB_ROLL_PTR: 回滚指针, 指向前一个版本 , 组成 undo 链
    DB_ROW_ID: 行id的值 自增

    • insert undo log: 只在事务回滚时需要, 事务提交就可以删掉了
    • update undo log: 包括update 和 delete , 回滚和快照读 都需要
    undo log

    开始只有最下面一行,
    事务1 先排他锁锁住它(当前读,读到最新数据然后独占),复制到第二行,更新字段, 把自己的id填入DB_TRX_ID, 让DB_ROLL_PTR 指向原数据
    事务2也有一样, 产生的第三行

    相关文章

      网友评论

          本文标题:8.2 快照读,当前读

          本文链接:https://www.haomeiwen.com/subject/epyjyqtx.html