分布式事务
ORA-01453
一、起因
用户请求批量回滚分布式事务,发来查询sql如下:
SELECT 'rollback force '''
|| local_tran_id
|| ''';'
FROM dba_2pc_pending
WHERE db_user = '&username'
AND state = 'collecting';
随后查出来一百多条结果,执行其中的返回语句,发现会话hang住了,另开一窗口查询hang住的会话的等待事件,为“free global transaction table entry”。
二、解决方案
设置隐藏参数
alter system set "_smu_debug_mode" = 4;commit;
构造批量处理的查询函数
--后面的commit很重要,去掉会报ora-01453
SELECT 'exec DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('''
|| LOCAL_TRAN_ID
|| '''); commit;'
FROM dba_2pc_pending
WHERE db_user = '&username'
AND state = 'collecting';
执行结束后将隐藏参数改回
alter system set "_smu_debug_mode" = 0;commit;
三、总结
状态为 collecting 的分布式事务无需 rollback force 即可purge清除,状态为 prepared的分布式事务需要先 rollback force 才能purge。
本文分享自微信公众号 - Oracle工作笔记,如有侵权,请联系 service001@enmotech.com 删除。
文章转载自Oracle工作笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




