暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

分布式事务回滚

Oracle工作笔记 2019-07-29
885
  1. 分布式事务

  2. 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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论