多个参与资源共享事务边界

一项操作如果需要改变多个节点或数据库,仅让每一处本地事务各自成功,并不能保证整体全部成功。分布式事务把这些参与部分关联到共同提交或撤销的要求,避免一部分被认作已完成,另一部分却决定放弃。

Gray与Lamport将提交问题表述为参与资源管理器达成一致:提交必须以各方愿意提交为前提。这里讨论的是明确纳入协议的参与者,不是让任意网页请求或外部副作用自动变成可回滚资源。

参考:[1] [2]

参与者需要可恢复的准备能力

两阶段提交是一种协调办法,参与者先准备,再根据决定结束。PostgreSQL的准备事务可脱离最初会话继续存在,之后通过标识提交或撤销,供外部事务管理器把多个资源串进同一协议。

事务管理器还须跟踪未结束的准备项。PostgreSQL文档提醒,这些项继续占锁并可能影响维护;客户端断开或某个进程重启,不应让系统永久忘记哪些资源仍在等待最终决定。

参考:[2] [3]

提交一致性之外还有隔离与进展

统一提交解决的是各参与者对结果的共同认定,并没有单独说明并发事务之间怎样读写数据。隔离级别、锁定和依赖检查仍需由适用系统提供,不能把“使用分布式事务”当成任意并发历史都正确的证明。

网络和协调者故障还会影响完成时间。经典两阶段提交可能保持安全却暂时无法作出最终决定;设计时应同时说明允许的结果、恢复责任以及继续推进所依赖的条件,而不只说明正常路径。

参考:[4] [1]