当前读
这些是当前读:
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 , 回滚和快照读 都需要
开始只有最下面一行,
事务1 先排他锁锁住它(当前读,读到最新数据然后独占),复制到第二行,更新字段, 把自己的id填入DB_TRX_ID, 让DB_ROLL_PTR 指向原数据
事务2也有一样, 产生的第三行
网友评论