分布式数据库事务是否保证提交/回滚?

aw *_*rud 1 sql oracle transactions distributed-transactions

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

Jon*_*ler 6

如果Oracle不使用等效的两阶段提交(2PC)协议,我会感到很惊讶,这可以确保提交或同时回滚.

对于2PC,有一个称为预提交阶段的阶段,其中主(协调者)实例记录其自己的决策并告诉所有参与者准备提交(并报告其状态 - 必须失败,或者可以提交).参与者也准备好提交,并且(如果他们可以提交)在告知协调员他们准备好提交之后等待协调员的进一步指示.当所有参与者都做出回应时,协调员记录最终决定,并将该决定发送给参与者,并根据其决定采取行动.如果主服务器在记录决策之后但在成功将决策发送给参与者之前失败,则参与者可以挂起,他们既不能提交也不能回滚.有办法从中恢复.如果协调员长时间停留(例如,由于灾难性的h/w故障而停止运行),你可能会遇到问题; 参与者通常最终会进行启发式回滚(假定回滚) - 但这需要非常糟糕的运气才能造成任何麻烦.

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