先写必须共同成立的不变量
纸面例子中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 学习支持,请在咨询中填写模块名称、学习目标和已尝试的步骤。具体教学安排须确认,计分作业由学生独立完成。
