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

分布式事务是指一个事务在本地和远程执行,本地需要等待确认远程的事务结束后,进行下一步本地的操作。如通过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)

ORACLE 分布式事务处理(一般情况):等您坐沙发呢!

发表评论

gravatar

? razz sad evil ! smile oops grin eek shock ??? cool lol mad twisted roll wink idea arrow neutral cry mrgreen

快捷键:Ctrl+Enter