# Distributed

### write ahead log (WAL)

预写日志，为了保证数据存储的原子性和持久性

> 修改并不直接写入到数据库文件中，而是写入到另外一个称为 WAL 的文件中；如果事务失败，WAL 中的记录会被忽略，撤销修改；如果事务成功，它将在随后的某个时间被写回到数据库文件中，提交修改。

> *   读和写可以完全地并发执行，不会互相阻塞（但是写之间仍然不能并发）。
> *   WAL 在大多数情况下，拥有更好的性能（因为无需每次写入时都要写两个文件）。
> *   磁盘 I/O 行为更容易被预测。
> *   使用更少的 fsync()操作，减少系统脆弱的问题。

> mysql 通过 redo、undo 日志实现 WAL。redo log 称为重做日志，每当有操作时，在数据变更之前将操作写入 redo log，这样当发生掉电之类的情况时系统可以在重启后继续操作。undo log 称为撤销日志，当一些变更执行到一半无法完成时，可以根据撤销日志恢复到变更之间的状态。mysql 中用 redo log 来在系统 Crash 重启之类的情况时修复数据（事务的持久性），而 undo log 来保证事务的原子性。

### B+ 树

> B+树比B-树的优势三个：
>
> *   单一节点存储更多的元素，使得查询的IO次数更少。
> *   所有查询都要查找到叶子节点，查询性能稳定。
> *   所有叶子节点形成有序链表，便于范围查询。

### Multi-Version Concurrency Control (MVCC)

多版本并发控制，主要是为了提高数据库的并发性能

> 同一行数据平时发生读写请求时，会上锁阻塞住。但mvcc用更好的方式去处理读—写请求，做到在发生读—写请求冲突时不用加锁。

### 乐观锁 悲观锁

观锁和悲观锁是两种思想，用于解决并发场景下的数据竞争问题。

> *   乐观锁：乐观锁在操作数据时非常乐观，认为别人不会同时修改数据。因此乐观锁不会上锁，只是在执行更新的时候判断一下在此期间别人是否修改了数据：如果别人修改了数据则放弃操作，否则执行操作。
> *   悲观锁：悲观锁在操作数据时比较悲观，认为别人会同时修改数据。因此操作数据时直接把数据锁住，直到操作完成后才会释放锁；上锁期间其他人不能修改数据。
