我理解2阶段提交架构。让2个奴隶和1个主人,所有准备阶段都很顺利。当master askede slave 1提交时,提交很好。当主人要求奴隶2提交时,它失败了。所以master现在需要回滚整个事务。我的问题是奴隶1现在将如何实施rollbakc,因为它已经提交了?据我所知,提交是完整的和最终的。可能会在磁盘上保存点或日志以恢复状态,但这可能需要DBA帮助。
参考SO - Can a transaction be rolled back after it's committed and connection is closed?
答案 0 :(得分:1)
2阶段提交实际上意味着提交分两个阶段发生,而不是特别是两个数据端点。从您的示例中我得到的印象是,您假设参与提交的2个从属意味着2个阶段。这是不正确的。提交的第一阶段(从设备1响应为可行)实际上并不是由从设备1向下传播。因此,当从设备1在阶段1中提交时,它实际上更多地是它保留在内存中的纪念品副本。它实际上不会对基础数据源发出提交。当Salve 2表示第一阶段的回滚时,主人也会发出回滚来回复1,这可以很容易地做到,因为没有任何东西持续存在或传播到下游。
但是,如果slave 2也表示commit,则master会向两个slave发出第二阶段提交指令,以实际将提交操作发送到其数据源的下游。现在,此操作中的参与方可以是2(如您的示例中)或更多。您可以在线详细了解它。只是谷歌的XA交易和2阶段协议。简而言之,请记住,第一阶段更多的是软提交,其中每个参与的端点只是说'如果它可以做提交'第二阶段是实际的硬提交。
答案 1 :(得分:1)
这通常是不可能的。两阶段提交的准备阶段应该做一切必要的事情来使事务持久,除非让其他人看到它。准备工作成功完成后,提交应该始终。一旦提交了两阶段提交,就无法将其撤消。
如果已准备好的事务的提交失败(例如,因为资源暂时不可用),则资源管理器应该能够恢复事务并重试提交。如果这是不可能的,那么资源不支持真正的两阶段提交,并且可能伪造它(例如忽略准备调用)。
因此不应回滚成功提交,但应重试失败的提交!