在对某个页面进行读写访问时,都会先把这个页面加载到 Buffer Pool 中,之后如果修改了某个页面,也不会立即把修改同步到磁盘,而只是把这个修改了的页面加到 Buffer Pool 的 flush 链表中,在之后的某个时间点才会刷新到磁盘
18.1.1 原子性(Atomicity)
要么全做,要么全不做的规则称之为原子性
18.1.2 隔离性(Isolation)
不仅要保证这些操作以原子性的方式执行完成,而且要保证其它的状态转换不会影响到本次状态转换,这个规则被称之为隔离性
18.1.3 一致性(Consistency)
如果数据库中的数据全部符合现实世界中的约束,我们说这些数据是符合一致性的
如何保证一致性
- 数据库本身能为我们保证一部分一致性需求
- 更多的一致性需求需要靠写业务代码的程序员自己保证
原子性和隔离性都会对一致性产生影响
18.1.4 持久性(Durability)
持久性意味着状态转换对应的数据库操作所修改的数据都应该在磁盘上保留下来,不论之后发生了什么事故,本次转换造成的影响都不应该被丢失掉
18.2 事务的概念
把需要保证原子性、隔离性、一致性和持久性的一个或多个数据库操作称之为一个事务
- 活动的(active):事务对应的数据库操作正在执行过程中
部分提交的(partially committed):当事务中的最后一个操作执行完成,但由于操作都在内存中执行,所造成的影响并没有刷新到磁盘
失败的(failed):当事务处在活动的或者部分提交的状态时,可能遇到了某些错误(数据库自身的错误、操作系统错误或者 直接断电等)而无法继续执行,或者人为的停止当前事务的执行,我们就说该事务处在失败的状态
- 中止的(aborted):如果事务执行了半截而变为失败的状态,就要撤销失败事务对当前数据库造成的影响,称为回滚(undo),当回滚操作执行完毕时,也就是数据库恢复到了执行事务之前的状态,我们就说该事务处在了中止的状态
- 提交的(committed):当一个处在部分提交的状态的事务将修改过的数据都同步到磁盘上之后,我们就可以说该事务处在了提交的状态
只有当事务处于提交的或者中止的状态时,一个事务的生命周期才算是结束了
对于已经提交的事务来说,该事务对数据库所做的修改将永久生效,对于处于中止状态的事务,该事务对数据库所做的所有修改都会被回滚到没执行该事务之前的状态