8.2 快照读,当前读

2019-02-22  本文已影响0人  胖达_4b7e

当前读

这些是当前读:

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的值 自增

undo log

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

上一篇 下一篇

猜你喜欢

热点阅读