1、MVCC
MVCC(Multi-Version Concurrency Control),多版本并发控制,MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问。在编程语言中实现事务内存。
1、为什么需要MVCC?
- 数据库通常使用锁来实现隔离性。最原生的锁,锁住一个资源后会禁止其他任何线程访问同一个资源。
- 但是很多应用的特点都是读多写少。很多数据的读取次数远大于修改的次数。而读取数据间互相排斥显得不是很重要。所以就使用了一种读写锁的方法。
- 读锁和读锁之间不互斥,但是写锁和写锁,写锁和读锁之间是互斥的。这样很大提升了系统的并发能力。
- 后来随者业务扩展,发现并发读取还是不够。又提出了能不能让读写之间也不冲突的方法。就是读取数据时,通过一种类似快照的方式将数据保存下来。这样读锁和写锁不冲突了,不同的事务session会看到自己特定版本的数据。当然快照只是一种概念模型,不同的数据库可能用不同的方式来实现这种功能。
2、InnoDB与MVCC
- MVCC只在Read Committed读已提交,Repeatable Read可重复读这2个隔离级别下工作。其他2个读未提交,可串行化,两个隔离级别和MVCC不兼容。
- 因为Read Uncommitted读未提交总是读取最新的数据行,而不是符合当前事务版本的数据行。
- Serializable可序列化,则会对所有读取的行都加锁,效率最慢。
3、Redo Log,Bin Log,Undo Log
1、BinLog
- Bin Log就是MySQL服务层产生的日志,常用来进行数据恢复、数据库复制 ,常见的MySQL的主从架构,就是采用Slave同步Master的Bin Log实现的。另外通过解析Bin Log能够实现MySQL到其他数据源比如ES的数据复制。
2、Redo Log
- Redo Log记录了数据操作在物理层面的修改。MySQL中使用了大量缓存,缓存存在内存中,修改操作时会直接修改内存,而不是离开修改磁盘。当内存和磁盘的数据不一致的时候,叫做内存中的数据为脏页Dirty Page。为了保证数据的安全性,事务进行中时会不断的产生Redo Log,在事务提交的收进行一次Flush刷盘操作,保存数据到磁盘中。Redo Log时按照顺序写入的,磁盘的顺序读写的速度远大于随机读写。当数据库挂掉重启的时候,会根据Redo Log进行数据的恢复,如果Redo Log中有事务提交,则进行事务提交修改数据。这样实现了事务的原子性、一致性和持久性。
3、Undo Log
- InnoDB中通过Undo Log实现了数据的多版本,而并发控制通过锁来实现。
- Undo Log除了实现MVCC外,还用于事务的回滚。MySQL的InnoDB中存在多种日志,除了错误日志、查询日志外,还有很多和数据持久性,一致性有关的日志。
- 除了记录Redo Log外,当进行数据修改的时候还会记录Undo Log,Undo Log用来数据的撤回操作,它记录了修改的反向操作,比如,插入对应删除、修改对应修改为原来的数据。
- 通过Undo Log实现事务回滚,并且可以根据Undo Log回溯到某个特定的版本的数据,实现MVCC多版本并发控制