一、起因
用户请求批量回滚分布式事务,发来查询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。
网友评论