学习指南 →

· Albion Gateway College

数据库专业课:事务为什么要把两次更新放在一起?

用虚构账户转移解释事务原子性、COMMIT 与 ROLLBACK,区分撤销未提交变更与撤回已提交交易。

先写必须共同成立的不变量

纸面例子中A有50、B有20,要把10从A转到B。若先扣A再遇到错误,最终40和20会让总额从70变60。需求不是“两条UPDATE都能运行”,而是两条共同成功或共同失败。

在PostgreSQL教学数据库中,可以用BEGIN开始事务,依次更新,再COMMIT;若中途放弃,用ROLLBACK撤销这笔尚未提交的事务。只在虚构数据上练习。

事务范围比语句顺序更重要

事务成功后A=40、B=30,总额70;若在提交前回滚,两者恢复50与20。把每个阶段的状态写成表,可解释为什么中间状态不该作为完成结果对外展示。

单纯连续执行两条自动提交语句,并不能获得同一事务的整体原子性。异常处理也要确认连接是否仍处在失败事务状态,不能只打印错误后继续假装成功。

原子性没有解决所有问题

余额不得为负、账户是否存在、并发扣款和隔离级别都是额外问题。BEGIN本身不会自动替你验证这些业务条件。已COMMIT的变更也不能靠事后ROLLBACK直接撤销,通常需要新的补偿操作或恢复策略。

自练:在两次更新之间人为制造错误,记录最后状态,再写一个缺少目标账户的案例。先验证受影响行数和业务约束,再讨论事务是否应该提交。

参考资料

下一步

如需大学专业课程或 Tutorial 学习支持,请在咨询中填写模块名称、学习目标和已尝试的步骤。具体教学安排须确认,计分作业由学生独立完成。

继续阅读

学院在线咨询

欢迎咨询

你好,欢迎咨询!你是学生、招生代理、求职者,还是想申请成为导师?请告诉我你的咨询方向。

[email protected]