两阶段添加协议目的:处理各种可能出现的故障,解释在各种可能故障情况下会发生什么。
假设:
- 事务访问资源时,发生炎症错误,发出异常终止;没有发生错误,发出提交操作。
- 资源管理器可以提交或终止事务的一部分。
- 事务有且仅有一个程序发出提交操作。
两阶段提交定理:
定理一:对于每一个可能的提交协议(不只是两阶段提交),通信故障可能导致参与者阻塞。
定理二:没有哪个调教协议可以保证故障的参与者能独立恢复。
故障处理
协调者角度:
- prepare接受消息超时或者接受到一个以上的NO消息。异常终止。
- 从所有的参与者接受DONE消息,无限等待,如果超时,会想参与者发送提醒重新请求DONE。
参与者角度:
- 接受prepare,如果超时,单方面终止事务,如果延迟,则投票NO。
- 接受做出决定的消息(Commit或者Abort)。如果超时,进入阻塞状态,什么都不做。
故障与日志