一、原子性(A)
原子性主要由redo log和undo log来实现
1、redo log记录了数据页的修改,如果事务提交后宕机了,可以通过redo log将事务恢复到提交后的状态。
2、undo log记录了各个事务的版本,如果事务失败需要回滚,那么可以利用undo log来恢复数据。
二、持久性(D)
主要通过redo log和二次写来实现
1、redo log记录了数据页的修改,可以通过它来恢复丢失的数据页
2、二次写:
- 写入某个页到磁盘时,如果此时只写了一部分就宕机了,那么这时可以通过重做日志进行恢复;但是数据页也破坏了,那么就无法恢复事务了,所以写入redo log前,进行二次写,对页进行备份。
- 对缓冲页进行刷新时,并不是直接写入磁盘,而是先将脏页复制到内存中的doubleWrite buffer中,之后通过doublewrite分两次,一次1M的写入共享表空间的物理磁盘上,然后调用fysnc进行同步刷盘。这个过程中,doublewrite也是连续的,写入很快。写入doublewrite到磁盘后,再将doublewrite buffer中的数据写入到各个表空间。
三、隔离性(I)
利用mvcc和锁实现。
1、针对各个不同的隔离识别,readview不同,针对可重复读的场景,利用mvcc保证读时不发生幻读,利用next key防止插入时发生幻读。
2、读未提交就是获取最新的事务;串行化使用互斥锁;RC和RP的快照读就通过mvcc,RC的当前读使用的是record_lock而RP使用的是Next-key Lock
四、一致性
通过上面以上3点一起保证一致性。