- 原子性,事务是一个不可分割的基本单位,其中操作要么都执行,要么全部不执行。这个其实就是回滚的实现机制,所以说原子性的实现原理就是undo log
undo log是逻辑日志,记录每个记录以前的版本。当事务对数据库进行修改的时候,Innodb会生成该事务对应的undo log,如果说这个事务回滚了,就使用undo log中的信息将数据回滚到修改之前的样子
-
一致性,这时候我们数据库追求的最终目标,必须从一个一致性状态到另一个一致性状态。比如转账操作最后钱的总数要一致,一致性的实现,主要是由事务的其他特性共同来保证的
-
隔离性,一个用户的事务不能被其他事务干扰。这个是由MVCC + next-key Lock来保证的,RC这个隔离级别不满足隔离性,必须要使用RR隔离级别,才能保证隔离性。
-
持久性,事务一旦提交,对数据库的修改必须是永久的。换句话说,就是保证万一数据库突然宕机,事务对数据库的修改不应该丢失,实现原理就是redo log日志。下面详细解释下:
当数据写入磁盘的时候,innodb会先将这个数据写入内存缓冲区,然后再将内存缓冲区刷到磁盘里面,数据批量写入,这样效率是最高的。
但是这样有个问题,如果内存缓冲区里面有数据还没有刷入磁盘,但是这时候宕机了,有一部分数据会丢失。所以引入了redo log日志,写数据的时候,"先写日志,后写缓存",这样即使突然宕机,数据也能恢复。
这个redo log是磁盘日志,采用顺序IO,速度较快,断电数据也不丢失。