数据库学习笔记_15_交易原子性和持久性详解
本篇对于交易的原子性和持久性做一个详解。
交易有5个阶段,
活动(active) 部分递交(partially committed) 失败(failed) 弹出(aborted) 递交(committed)
一个中途失败的交易被称为弹出交易(aborted) 所有弹出交易必须被回滚 数据回滚的机制我们称为回复方案(recover scheme),主要是通过系统日志实现的,在记录中我们记录操作的ID,被修改数据的ID,其原值和其修改值。记录以后才轮到数据库本身的修改。这样的设计能满足durability的需求。
一个成功的交易被称为committed transaction,这个数据被写入以后就难以回滚,唯一的回滚方法是通过抵消操作,即递交另外一个相反的操作,但是有些操作是不能回滚的,所以这部分的锅我们交给了用户。
活动的交易即为正在进行的交易。
部分递交的交易,书上并没有说得很详细,于是我谷歌了一下,得到了一个还算满意的结果:
大概意思就是说,部分提交就是程序把逻辑内容执行完了,但是可恢复性数据库管理系统还没有把这个结果生成永久性数据,所以先在那里晾着。
失败:即是因为外部错误或者内部逻辑错误导致程序无法继续运行,在这个时候开始执行回滚
对于一个弹出的交易,在弹出执行完毕以后,有两种选择,一种是重启(restart)一种是终结(kill),重启的情况适用于外部非逻辑性原因改变导致的失败,终结适用于程序内部逻辑执行出错误。
这里值得一提的是有一个可观察外部写数据,就是说,银行可能用过email给你发账户余额,或者把账户余额写在atm机上,因为这种数据显示是外部的,所以不能执行回滚。一个比较好的方法就是直到递交后才把执行外部显示操作。