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状态的分布式事务记录