2011-02-07 105 views
1

我有应用程序代码在本地数据库和远程数据库中的记录(通过Oracle数据库链接)中插入一条记录。当我提交这个分布式事务时,它确保本地和远程数据库都会同时提交或者都进行回滚,或者有可能远程服务器可以提交,但是本地提交会失败(反之亦然)?分布式数据库事务是否保证提交/回滚?

+2

如果他们对每台服务器的独立事务处理相同,那么分布式事务处理会有什么意义? (允许您关注的提交/回滚不匹配) – 2011-02-07 14:32:41

+0

@Damien_The_Unbeliever:我同意,但我只是没有看到每种可能性如何被解释。乔纳森的回答是有道理的 - 似乎仍然有一些情况下,如果一个系统发生灾难性故障,事情就会被挂起,但绝大多数情况都会被处理。 – 2011-02-07 15:19:38

回答

6

如果Oracle不使用Two-Phase Commit(2PC)协议的等价物,那么确保既可以同时提交也可以同时进行回滚,我会感到惊讶。

对于2PC,有一个阶段称为预提交阶段,其中主(协调器)实例记录其自己的决定并告诉所有参与者准备提交(并报告其状态 - 必须失败或可提交) 。参与者也准备好提交,并且(如果他们可以提交)在告诉协调员准备好提交之后等待协调员的进一步指示。当所有参与者都做出回应时,协调员记录最终决定,并将决定发送给参与者,并根据其决定行事。如果主人在记录了决策之后但在成功地将决定发送给参与者之前失败,则参与者可以挂在他们既不能提交也不能回滚的状态。有办法从中恢复。如果协调员保持足够长的时间(例如,由于灾难性的硬件故障而停止使用),则最终会出现问题;参与者最终会做一次启发式回滚(推测回滚) - 但这需要非常糟糕的运气来引起任何麻烦。

有2PC的替代品;最终结果是相同的 - 所有提交或全部回滚。