多步操作的共同边界

一次业务操作可能需要修改多张表。转账既要扣减一个账户,也要增加另一个账户;数据库事务把这些相关步骤归入同一个工作单元,使调用者能够共同提交或共同取消受事务保护的修改。

事务边界由实际接口决定。PostgreSQL中,BEGIN与COMMIT可把多条语句组成事务块,ROLLBACK取消未提交修改;没有显式事务块时,单条语句仍在事务中执行。客户端库也可能自动管理这些边界。

参考:[1] [2]

保存点与整体提交

保存点允许事务先记录一个中间位置,再撤销此后的一部分修改。例如转账对象选错时,可以保留前面的检查,回到保存点修正后续工作,不必立即提交已完成的部分。

回滚到保存点仍发生在外层事务之内。保留下来的修改尚须由最终提交决定是否完成;释放保存点也不等于把这些修改独立永久写入。保存点给出局部控制,外层事务继续承载共同边界。

参考:[1]

结果还取决于隔离与范围

把语句放在一起,并不自动解决所有并发问题。两个事务能看见哪些已经提交的变化,由隔离级别及实现规则决定;需要可串行化结果时,还可能因冲突而撤销重试。

事务通常保护所连接数据库管理的状态。已发出的邮件、远端付款或其他外部动作,不会仅凭本地ROLLBACK自动撤回。应用必须把数据库边界与外部效果的完成、重试和补偿分别设计清楚。

参考:[3] [4]