当前位置: 首页 > BASIC > 正文

ORACLE 分布式事务处理(一般情况)

分布式事务是指一个事务在本地和远程执行,本地需要等待确认远程的事务结束后,进行下一步本地的操作。如通过dblink update远程数据库的一行记录,若在执行过程中网络异常,或其他事件导致本地数据库无法得知远程数据库的执行情况,此时就会发生in doublt的报错。此时需要根据不同情况进行处理。

欢迎大家加入ORACLE超级群:17115662 免费解决各种ORACLE问题,以后BLOG将迁移到http://www.htz.pw

 

1、首先检查分布式事务状态,方法如下:

select local_tran_id,state from dba_2pc_pending ;

查询结果为空或者为commited为正常。Collectingprepared为异常。

2、状态为prepared时,处理流程如下:

rollback force ‘local_tran_id’;

执行成功或者不返回结果都可以

select state,local_tran_id from dba_2pc_pending where state=’prepared’;

检查状态变为forced rollback后可以执行以下命令清除分布式事务的日志

alter session set "_smu_debug_mode" = 4;

execute DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY(‘local_tran_id ‘);

commit

3. 状态为collecting

可以观察10分钟,看系统能否自动清理失败的分布式事务,10分钟后状态仍然是collecting, 可以采取以下操作清理

select state,local_tran_id from dba_2pc_pending ;

rollback force ‘local_tran_id’;

执行失败报错没有这个local_tran_id

执行以下命令清除分布式事务的日志

alter session set "_smu_debug_mode" = 4;

execute DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY(‘local_tran_id’);

commit;

检查是否有回滚段异常

select segment_name,status from dba_rollback_segs where status not in (‘ONLINE’,’OFFLINE’);

如果存在状态为need recovery的回滚段,需要将切换UNDO表空间到备用UNDO表空间,删除状态异常的回滚段来清理失败的事务。

更多详细的信息见MOS:

         Manually Resolving In-Doubt Transactions: Different Scenarios (文档 ID 126069.1)

本文固定链接: http://www.htz.pw/2014/06/19/oracle-%e5%88%86%e5%b8%83%e5%bc%8f%e4%ba%8b%e5%8a%a1%e5%a4%84%e7%90%86%ef%bc%88%e4%b8%80%e8%88%ac%e6%83%85%e5%86%b5%ef%bc%89.html | 认真就输

该日志由 huangtingzhong 于2014年06月19日发表在 BASIC 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: ORACLE 分布式事务处理(一般情况) | 认真就输
关键字: ,