参考:https://www.cnblogs.com/f-ck-need-u/archive/2018/05/08/9010872.html
参考:https://www.cnblogs.com/hjw-zq/p/9802847.html
首先什么是事务?
事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库的存取。事务的正确执行使得数据库从一种状态转换为另一种状态。
事务必须遵守ACID原则。是原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)的缩写。
事务的隔离性是通过锁来实现的,而事务的原子性、一致性和持久性则是通过事务日志来实现的。
什么是事务日志?
事务日志是一个与数据库文件分开的文件。它存储对数据库进行的所有更改,并全部记录插入、更新、删除、提交、回退和数据库模式的变化。事务日志还称作前滚日志或重做日志。事务日志是备份和恢复的重要组件。
事务要保证ACID的完整性必须依靠事务日志做跟踪,每一个操作在真正写入数据数据库之前,先写入到日志文件中。如要删除一行数据会先在日志文件中将此行标记为删除,但是数据库中的数据文件并没有发生变化。只有在(包含多个sql语句)整个事务提交后,再把整个事务中的sql语句批量同步到磁盘上的数据库文件。
在事务引擎上的每一次写操作都需要执行两遍:
1.先写入日志文件中。
写入日志文件中的仅仅是操作过程,而不是操作数据本身,所以速度比写数据库文件速度要快很多。
2.然后再写入数据库文件中。
写入数据库文件的操作是重做事务日志中已提交的事务操作的记录。
事务日志的好处?
事务日志采用的追加的方式,因此写日志的操作是磁盘一小块区域的顺序IO,而不像随机IO需要在磁盘上多个地方移动,所以采用事务日志的方式,相对来说快很多,事务日志持久后,内存中的修改在后台慢慢刷回磁盘,期间如果系统发生崩溃,存储引擎在重启的时候依靠事务日志恢复这部分被修改的数据。
Mysql的事务日志?redo log和undo log
不同的存储引擎对事务的支持程度不一样.InnoDB是mysql默认的存储引擎。Innodb的事务日志包括redo log和undo log。redo log是重做日志,提供前滚操作,undo log是回滚日志,提供回滚操作。
redo log和undo log的区别
UndoLog:为了满足事务的原子性,在操作任何数据之前,首先将数据备份UndoLog,然后进行数据的修改。如果出现了错误或者用户执行了ROLLBACK语句,系统可以利用Undo Log中的备份将数据恢复到事务开始之前的状态。undo用来回滚行记录到某个版本。undo log一般是逻辑日志,根据每行记录进行记录。
RedoLog:记录的是新数据的备份。在事务提交前,将RedoLog持久化而不需要将数据持久化。当系统崩溃时,虽然数据没有持久化,但是RedoLog已经持久化。系统可以根据RedoLog的内容,将所有数据恢复到最新的状态。通常是物理日志,记录的是数据页的物理修改,而不是某一行或某几行修改成怎样怎样&