隔离性由锁来实现。通过XS锁和MVCC实现事务隔离。
原子性和持久性由redolog来实现。
一致性由undolog来实现。

redolog

redolog有两部分,一个是内存在那个的redo log buffer,一个是磁盘中的redo log file。
如果对数据的持久性要求非常高,就需要打开force log at commit,这样每条事务需要落到磁盘(fsync函数)中的redolog才会算完全提交,但显然性能较低。
如果说对机器宕机或掉电这种概率带来的数据丢失可容忍,那么应该讲事务写到redolog buffer中即可,等待master thread进行定时刷盘。性能非常高。
控制的redolog刷盘的参数为innodb_flush_log_at_trx_commit,取值如下:
0:不实时刷盘,性能最好,但存在丢失的可能。
1:默认取值,实时刷盘,性能最差,保证数据不丢失。
2:实时将redolog缓冲写到OS缓冲,但不调用fsync将OS缓冲落到磁盘。性能适中,如果db进程挂掉,数据不会丢失,如果机器挂掉,数据依然会丢失。
image.png