ACID实现原理
原子性
一个事务是不可分割的工作单位
undo log(原子性,隔离性的基础):逻辑文件,记录sql相关信息,发生回滚时,根据undo log做与之前相反的工作,还原数据。
持久性
一旦提交,永久性改变。
redo log:buffer pool作为访问数据库的缓冲,从数据库读取数据时先从buffer pool读取,未读到,就从磁盘中读取并放入buffer pool中。写数据时,先写到buffer pool中,定期刷新到磁盘,提高读写效率。mysql宕机时刷脏未完成可能丢失数据,所以引入redo log记录,以物理格式记录,写数据时,写入buffer pool,同时在redo log中记录,提交时将日志写入磁盘,buffer pool刷盘后,redo log可以被覆盖。
redo log也有一个缓冲区,innodb_log_buffer,InnoDB先将redo log写入缓冲区,再通过三种方式刷盘到磁盘。
【
三种刷盘:
1.主线程每秒刷盘一次;2.缓冲区所占内存超过50%;3.事务提交时。
】
redo log比直接在buffer pool中写得快?
刷脏是随机IO,每次修改数据位置随机,redo log是追加操作,是顺序IO,且刷脏是以数据页page为单位,16kb,一个page页的一小部分修改也需要整页写入。redo log只包含数据修改,减少无效IO。
innodb_buffer_pool和innodb_log_buffer
innodb_buffer_pool缓存的数据页类型有:数据页,索引页,undo页,插入缓存,自适应hash索引,InnoDB存储的锁信息,数据字典信息等。
数据修改时只是修改innodb_buffer_pool的信息,然后将修改信息写入相应的事务日志,而不是直接同步到磁盘。因为innodb_buffer_pool修改的数据随机,直接同步到磁盘数据效率比较慢。
innodb_log_buffer事务日志先写入该缓冲中,在事件触发后刷入磁盘。记录了每次对数据库索引和数据的修改。
隔离性
事务内部的操作与其他事务是隔离的,并发不干扰
由锁机制来进行保证,先获取相应块的锁。
【
MVCC多版本控制:用undolog动态重构旧版本数据。提供并发访问数据库时对事务读取到的内存做处理,用来避免写操作堵塞读的并发问题。MVCC提供时间一致性处理思路,使用一个时间戳或事务ID确定访问哪个版本,读写隔离。
可重复度隔离级别使用MVCC解决快照读时的幻读问题,next-key锁(行锁+间隙锁)解决当前读的幻读问题。
】
一致性
完整性约束没有被破坏,事务执行前后都是合法的数据状态。
通过原子性,持久性,隔离性来实现,即并发控制技术和日志恢复技术。