分布式事务回滚

2019-07-29  本文已影响0人  Reiko士兵
  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。

上一篇 下一篇

猜你喜欢

热点阅读