当前读
读取的数据是最新版本,读取数据时还要保证其他并发事务不会修改当前的数据,当前读会对读取的记录加锁。比如:
select …… lock in share mode(共享锁)、select …… for update | update | insert | delete(排他锁)
快照读
每一次修改数据,都会在 undo log 中存有快照记录,这里的快照,就是读取undo log中的某一版本的快照。这种方式的优点是可以不用加锁就可以读取到数据,缺点是读取到的数据可能不是最新的版本。一般的查询都是快照读,比如:
select * from t_user where id=1;
在MVCC中的查询都是快照读。
undo log原理
undo log是把所有没有COMMIT的事务回滚到事务开始前的状态,系统崩溃时,可能有些事务还没有COMMIT,在系统恢复时,这些没有COMMIT的事务就需要借助undo log来进行回滚。
使用undo log时事务执行顺序
- 记录START T
- 记录需要修改的记录的旧值(要求持久化)
- 根据事务的需要更新数据库(要求持久化)
- 记录COMMIT T
使用undo log进行宕机回滚
- 扫描日志,找出所有已经START,还没有COMMIT的事务。
- 针对所有未COMMIT的日志,根据undo log来进行回滚。
逻辑日志:可以简单理解为记录的就是sql语句 。
物理日志:mysql 数据最终是保存在数据页中的,物理日志记录的就是数据页变更 。