为什么 InnoDB 能够保证持久性?
在事务处理的 ACID 属性中, 一致性是最基本的属性, 其它的三个属性都为了保证一致性而存在的.
首先回顾一下一致性的定义. 所谓一致性, 指的是数据处于一种有意义的状态, 这种状态是语义上的而不是语法上的. 最常见的例子是转帐. 例如从帐户 A 转一笔钱到帐户 B 上, 如果帐户 A 上的钱减少了, 而帐户 B 上的钱却没有增加, 那么我们认为此时数据处于不一致的状态.
在数据库实现的场景中, 一致性可以分为数据库外部的一致性和数据库内部的一致性. 前者由外部应用的编码来保证, 即某个应用在执行转帐的数据库操作时, 必须在同一个事务内部调用对帐户 A 和帐户 B 的操作. 如果在这个层次出现错误, 这不是数据库本身能够解决的, 也不属于我们需要讨论的范围. 后者由数据库来保证, 即在同一个事务内部的一组操作必须全部执行成功 (或者全部失败). 这就是事务处理的原子性.(用 Undo log 来保证的) 但是, 原子性并不能完全保证一致性. 在多个事务并行进行的情况下, 即使保证了每一个事务的原子性, 仍然可能导致数据不一致的结果, 比如丢失更新问题.
为了保证并发情况下的一致性, 引入了隔离性, 即保证每一个事务能够看到的数据总是一致的, 就好象其它并发事务并不存在一样. 用术语来说, 就是多个事务并发执行后的状态, 和它们串行执行后的状态是等价的.
来源: http://www.bubuko.com/infodetail-3460850.html