分布式事务是指一个事务在本地和远程执行,本地需要等待确认远程的事务结束后,进行下一步本地的操作。如通过dblink update远程数据库的一行记录,若在执行过程中网络异常,或其他事件导致本地数据库无法得知远程数据库的执行情况,此时就会发生in doublt的报错。此时需要根据不同情况进行处理。
欢迎大家加入ORACLE超级群:17115662 免费解决各种ORACLE问题,以后BLOG将迁移到http://www.htz.pw
1、首先检查分布式事务状态,方法如下:
select local_tran_id,state from dba_2pc_pending ;
查询结果为空或者为commited为正常。Collecting和prepared为异常。
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 分布式事务处理(一般情况):等您坐沙发呢!