delete from sys.pending_trans$ where local_tran_id = '657.7.39336'; delete from sys.pending_sessions$ where local_tran_id = '657.7.39336'; delete from sys.pending_sub_sessions$ where local_tran_id ='657.7.39336'; commit; Commit force '657.7.39336' exec dbms_transaction.purge_lost_db_entry('657.7.39336');
[oracle@standby ~]$ oerr ora 01591 01591, 00000, "lock held by in-doubt distributed transaction %s" // *Cause: Trying to access resource that is locked by a dead two-phase commit // transaction that is in prepared state. // *Action: DBA should query the pending_trans$ and related tables, and attempt // to repair network connection(s) to coordinator and commit point. // If timely repair is not possible, DBA should contact DBA at commit // point if known or end user for correct outcome, or use heuristic // default if given to issue a heuristic commit or abort command to // finalize the local portion of the distributed transaction.
為了完成準準備階段,除了commit point site外,其它的數據庫節點按照以下步驟執行: 每個節點檢查自己是否被其它節點所引用,如果有,就通知這些節點準備提交(進入 Prepare階段)。 每個節點檢查自己運行的事務,如果發現本地運行的事務沒有修改數據的操作(只讀),則跳過后面的步驟,直接返回一個read only給全局協調器。 如果事務需要修改數據,則為事務分配相應的資源用于保證修改的正常進行。 當上面的工作都成功后,給全局協調器返回準備就緒的信息,反之,則返回失敗的信息。
2) Commit Phase 在該階段,協調者將基于第一個階段的投票結果進行決策:提交或取消。當且僅當所有的參與者同意提交事務協調者才通知所有的參與者提交事務,否則協調者將通知所有的參與者取消事務。參與者在接收到協調者發來的消息后將執行響應的操作。 提交階段按下面的步驟進行: 全局協調器通知 commit point site 進行提交。 commit point site 提交,完成后通知全局協調器。 全局協調器通知其它節點進行提交。 其它節點各自提交本地事務,完成后釋放鎖和資源。 其它節點通知全局協調器提交完成。
3)結束階段 全局協調器通知commit point site說所有節點提交完成。 commit point site數據庫釋放和事務相關的所有資源,然后通知全局協調器。 全局協調器釋放自己持有的資源。 分布式事務結束 一般情況下,兩階段提交機制都能較好的運行,當在事務進行過程中,有參與者宕機時,重啟以后,可以通過詢問其他參與者或者協調者,從而知道這個事務到底提交了沒有。當然,這一切的前提都是各個參與者在進行每一步操作時,都會事先寫入日志。
1.1 決定哪個數據庫為commit point site。(注,參數文件中commit_point_strength值高的那個數據庫為commit point site)
1.2 全局協調者(Global Coordinator)要求所有的點(除commit point site外)做好commit或者rollback的準備。此時,對分布式事務的表加鎖。
1.3 所有分布式事務的節點將它的scn告知全局協調者。
1.4 全局協調者取各個點的最大的scn作為分布式事務的scn。
至此,所有的點都完成了準備工作,我們開始進入COMMIT PHASE階段,此時除commit point site點外所有點的事務均為in doubt狀態,直到COMMIT PHASE階段結束。
2.COMMIT PHASE: 2.1 Global Coordinator將最大scn傳到commit point site,要求其commit。 2.2 commit point嘗試commit或者rollback。分布式事務鎖釋放。 2.3 commit point通知Global Coordinator已經commit。 2.4 Global Coordinator通知分布式事務的所有點進行commit。
3.FORGET PHASE: 3.1 參與的點通知commit point site他們已經完成commit,commit point site就能忘記(forget)這個事務。 3.2 commit point site在遠程數據庫上清除分布式事務信息。 3.3 commit point site通知Global Coordinator可以清除本地的分布式事務信息。 3.4 Global Coordinator清除分布式事務信息
2.prepare階段完成時發生失敗,global coordinator處于prepared狀態,已經加上分布鎖,等待提交,遠程commit point site已經自動回滾,此時需要在global coordinator上執行rollback force ‘transaction_id’,然后清除in_doubt狀態的分布式事務記錄
3.commit point site執行commit完成后其他站點尚未commit時發生失敗,這時需要在其他站點執行commit force ‘transaction_id’,'commit#’,注意后面的commit#使用較高的commit#,可以查詢各個站點的dba_2pc_pending試圖的commit#列得到,然后清除in_doubt狀態的分布式事務記錄