实现事务功能的三个技术: 日志文件(redo log)和(undo log),锁技术,MVCC
日志redo log和undo log | 读写锁 | MVCC |
日志文件redo log(重做日志): 有两部分组成,redo log buffer 和redo log ,用来恢复数据用的,用来保障已经提交数据的的持久化的
undo log(回滚日志): 是用来回滚数据的,主要是完成数据未提交事务的原子性;
锁+MVCC实现了隔离性
锁技术 : 读写锁,记录锁,间隙锁,读锁(因为是可以多个一起读所以是共享锁)
写锁(再写的过程中避免别人读到脏数据,排他锁)
隔离级别:读未提交:是因为多并发时侯,读不加锁,写加锁,所以读取过程中写入了数据就有可能造成脏读。
读已提交(视图):与MVCC机制有关,查过程中另一个线程执行更新操作,版本不同,每一次select过程中会查询 一个不同的版本号,造成了不可重复读。
不可重复读(一致性视图):两种实现方式1. 读写锁 2.MVCC机制+写锁: 多次读取只读取一个版本。
trx_id | roll_ptr | 隐藏id |
MVCC(InnoDB): 多版本并发控制 : 每行后面隐藏了3列数据,一个保存事务id,一个保存了回滚数据记录,一个隐藏id
通过记录锁和间隙锁阻止其他事务在锁定时插入数据,防止幻读。
最后通过隔离性+原子性+持久性完成数据一致性的实现
不可重复度和读已提交的实现区别
读已提交是在每一次select是创建一个当前版本的视图。
不可重复读是每次创建一个以第一次select语句出现的时候的一个版本,每次查询版本一样。