2014-12-02 47 views
1

我了解2阶段提交体系结构。让2个奴隶和1个主人,所有准备阶段都很好。当主设备提交时,提交很好。当主人要求奴隶2提交时,它失败了。所以现在主人需要回滚整个交易。我的问题是奴隶1现在会如何rollbakc,因为它已经承诺了?据我所知,提交是完整的和最终的。在磁盘上可能有保存点或日志来恢复状态,但这可能需要DBA帮助。上SO在2阶段提交中回滚

参考 - Can a transaction be rolled back after it's committed and connection is closed?

回答

1

这通常是不可能的。两阶段提交的准备阶段应尽可能使事务持久化,除了让其他人可见。准备完成后,一个提交应该可以使用总是。一旦提交了两阶段提交,就不能退出。

如果已准备好的事务提交失败(例如,因为资源暂时不可用),那么资源管理器应该能够恢复事务并且重试提交。如果这是不可能的,那么资源不支持真正的两阶段提交并且可能伪造它(例如通过忽略准备调用)。

所以成功的提交不应该回滚,但失败的提交应该重试!

1

2相提交实际上意味着提交发生在2个阶段,而不是专门在两个数据端点。从你的例子中我得到一个印象,你认为参与提交的2个奴隶意味着2个阶段。这是不正确的。提交的第一阶段(从机1回应为可执行的)实际上并不由从机1向下传播。因此,基本上当从机1在阶段1中表示提交时,其更多的是在存储器中保存的备忘录副本。它实际上并没有对底层数据源进行提交。当Salve 2表示第一阶段回滚时,主服务器发出回滚以保存1,这可以轻松完成,因为没有任何内容持续存在或传播到下游。

但是,如果从服务器2也表示提交,则主服务器向两个从服务器发出第二阶段提交指令,以实际将提交操作下游发送到其数据源。现在参与这个行动的参与方可以是2个(就像你的例子)或者更多。您可以在网上详细了解它。只需Google即可支持XA交易和2阶段协议。简而言之,第一阶段更像是一个软提交,其中每个参与的终点只是说'它是否可以执行提交'。第二阶段是实际的提交。

+0

当一个系统真的支持两阶段提交时,prepare使事务最终和持久(但对其他人不可见)。那么它应该 - 除了系统故障 - 总是可以完成提交。 – 2014-12-02 15:02:43

+0

马克是对的。在技​​术ACID术语中,第一阶段在其完成时耐用。从新手的角度来看,我会说它是一个软性承诺。 – Nazgul 2014-12-02 15:18:51