2011-02-07 71 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的替代品;最終結果是相同的 - 所有提交或全部回滾。