MySQL 本地事务
事务隔离性由锁来实现。
原子性、一致性、持久性通过数据库的 redo log 和 undo log 来完成。
Redo log 和 Undo log
redo log 称为重做日志,用来保证事务的原子性和持久性。undo log 用 来 保 证 事 务 的 一致 性 。
redo 和 undo 的作用都可以视为是一种恢复操作,redo 恢复提交事务修改的⻚操作,而 undo 回滚行记录到某个特定版本。
两者记录的内容不同,redo 通常是物理日志,记录的是页的物理修改操 作。undo 是逻辑日志,根据每行记录进行记录。
最后也是最为重要的一点是,undo log 会产生 redo log,也就是 undo log 的产生会伴 随着 redo 1og 的产生,这是因为 undo log 也需要持久性的保护。
Bin log
在 MySQL 数据库中还有一种二进制日志 (binlog),其用来进行 POININ-TIME(PIT)的恢复和主从复制环境的建立,从表面上看和重做日志很像,都是记录了对于数据库操作的日志。然而,从本质上来看,两者有着非常大的不同。
首先重做日志是在 InnoDB 存储引擎层产生,而二进制日志是在 MySQL 数据库的上层产生的,并且二进制日志不仅仅针对于 InnoDB 存储引擎,MySQL 数据库中的任何存储引擎对于数据库的更改都会产生二进制日志。
其次,两种日志记录的内容形式不同。MySQL 数据库上层的二进制日志是一种逻辑日志,其记录的是对应的 SQL 语句。而 InoDB 存储引擎层面的重做日志是物理格式日志,其记录的是对于每个页的修改。
此外,两种日志记录写人磁盘的时间点不同,二进制日志只在事务提交完成后进行一次写入。而 InnoDB 存储引擎的重做日志在事务进行中不断地被写入,这表现为日志并不是随事务提交的顺序进行写人的。