知识卡片
提交点与回滚:保证数据库故障后的一致性
内容
一笔转账要跨两步完成(一个账户扣钱、另一个账户加钱),在这两步之间数据库处于短暂的不一致状态——如果这时发生故障,钱可能凭空消失。解法是在允许事务真正修改数据库之前,先把要执行的变更完整记入一份持久化日志,全部步骤都记录完毕的那一刻称为提交点;如果故障发生在提交点之前,数据库管理系统可以依据日志把这笔未完成的事务彻底撤销(回滚),让数据库退回到事务开始前的状态,就像这笔事务从未发生过一样。发散:提交点机制的关键洞察是,用日志把”这次修改到底算不算数”变成了一个非黑即白的判断——要么日志证明整套步骤已完整记录(可以安全地当作已发生),要么没有(必须整体撤销当作从未发生),不存在”发生了一半”这种含糊状态,这正是保证复杂多步操作要么完全生效、要么完全不生效(这种性质称为原子性)的通用手法,在任何涉及多步骤状态变更的系统里都能看到它的身影。
参考来源
《计算机科学概论》第9章《数据库系统》