mysql 大杂烩
1、事物
高性能Mysql这本书对MVCC的定义。
他的主要实现思想是通过数据多版本来做到读写分离。从而实现不加锁读进而做到读写并行。MVCC在mysql中的实现依赖的是undo log与read view;
2、索引
3、锁
- MVCC解决的是普通读(快照读)的幻读,
- next-key locks解决的是当前读情况下的幻读。
4、当前读、快照读
MySQL InnoDB 引擎的默认隔离级别是「可重复读」,但是它很大程度上避免幻读现象(并未完全解决,参看[1]),解决的方案有两种:
1、针对快照读(普通 select 语句),是通过 MVCC 方式解决了幻读,因为可重复读隔离级别下,事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,即使中途有其他事务插入了一条数据,是查询不出来这条数据的,所以就很好地避免幻读问题。
2、针对当前读(select ... for update 等语句),是通过 next-key lock(记录锁+间隙锁)方式解决了幻读,因为当执行 select ... for update 语句的时候,会加上 next-key lock,如果有其他事务在 next-key lock 锁范围内插入了一条记录,那么这个插入语句就会被阻塞,无法成功插入,所以就很好地避免幻读问题。
5、redo log、undo log、binlog、 wal
https://www.cnblogs.com/mengxinJ/p/14211427.html
https://mp.weixin.qq.com/s/beGPbWn-y1k6zt1JIPgknQ
6、mysql军规
https://www.slideshare.net/slideshow/mysql-9838563/9838563#1
7、wal
Write Ahead Logging,简称WAL,也被翻译成预写式日志,是数据库技术中实现事务日志的一种标准方法,可以实现单机事务的原子性,同时可以提高数据库的写入效率。
原理
【写操作】 WAL怎么解决宕机和恢复的问题:
写WAL前宕机了,重启后,数据处于事务未执行的状态
写WAL时宕机了,重启后,可以检查到WAL数据不正确,回滚当事务前的状态
写WAL后宕机了,重启后,把WAL中记录的操作,应用到数据库文件中,得到事务执行后的状态
WAL的核心思想是: 先写日志再写数据文件,修改数据文件必须发生在修改操作记录在日志文件之后.
参考
https://www.jianshu.com/p/081a3e208e32
https://www.cnblogs.com/crazymakercircle/p/16990178.html