ACID
原子性
事务不可分割,要么全部执行,要么都不执行。原理是使用undo log。undo log,当事务对数据库进行修改的时候,会生成对应的undo log。
持久性
事务提交后,对于数据库的改变是永久性的。实现原理通过redo log.
- 加速读,读取优先从Buffer Pool读取,如果Buffer Pool中没有,从磁盘中读取放入Buffer Pool
- 加速写,当数据库写入数据,优先写入Buffer Pool,Buffer Pool会定期刷入数据库。
- WAL(Write Ahead Log):修改并不直接写入到数据库文件中,而是写入到另外一个称为 WAL 的文件中;如果事务失败,WAL 中的记录会被忽略,撤销修改;如果事务成功,它将在随后的某个时间被写回到数据库文件中,提交修改。
隔离性
并发执行的事务互不干扰。
隔离级别
- 读未提交
- 读已提交。
- 可重复读
- 串行化
脏读,不可重复读和幻读
- 脏读。一个事务读取到另一个事务未提交的数据。读已提交解决了这个问题。
- 不可重复读。另一个事务对数据进行修改,会导致当前事务查询的结果不一致。可重复读。
- 幻读。另一个事务新增数据,导致当前事务查询的数量前后不一致。串行化。
ReadView
- trx_ids:当前系统中未提交的事务
- low_limit_id:当前存在的最大的事务id+1
- up_limit_id:活跃事务中最小的事务id
- creator_trx_id:生成该ReadView的事务id
MVCC实现原理
读已提交和可重复读唯一的区别在于:
在RC隔离级别下,是每个select都会创建最新的ReadView;
而在RR隔离级别下,则是当事务中的第一个select请求才创建ReadView。
一致性
转账前后,金额保持一致性。