事务有四特性:原子性,一致性,隔离性,持久性,及ACID。
那么这四特性的底层原理是什么呢,看一下。
首先,如何实现事务的原子性 :
所谓原子性,就是事务要么全部执行完成 ,要么全部回滚,执行失败,从一个一致性的状态转换到另一个一致性的状态。
一致性就是事务开始之前和结束之后,数据库完整性约束没有被破坏。
隔离性就是两个事务在各自提交之前不可见。
持久性就是事务一旦提交,就会永久落盘,不会再回滚。
事务的原子性是由undo log来保证的,事务开始前,会先将旧数据保存一份到undo log中,如果在这中间环节出现故障,那么,会通过之前版本的undo log 恢复到之前版本数据库,保证了事务的原子性。
事务的持久性是由redo log 和undo log一起实现,undo log保存旧数据,redo log保存新数据,在事务提交时只需将redo log 落盘,持久化到磁盘上就可以。
注:日志并不是直接写入文件的,而是先写入redo log buffer 当需要将日志刷新到磁盘上时,将许多事务一起写入磁盘。在数据恢复时,先执行重做日志,在通过undo回滚未提交的事务,先redo,后undo
事务的原子性和一致性有区别,但是又不能分开看,这两个特性是互补的,一致性要求事务执行前后数据库保证一致性,但是中间的操作必然会有暂时的不一致,原子性就发挥了作用。
原子性消除了事务在执行期间不可避免的不一致状态对事务执行前后的数据库状态的影响。
事务的隔离性是靠加锁来实现,有四种隔离级别,每种的加锁方式不同,实现的隔离性能也不同。(看事务隔离级别及底层原理那篇笔记)。
Redo log的物理文件是ib_logfile。。。
Undo log的5.6之前在共享表空间的回滚段中,即ibdata,在5.7之后可以设置独立表空间,回滚段在独立表空间中,也可以继续用共享表空间。