美文网首页
分布式事务回滚

分布式事务回滚

作者: Reiko士兵 | 来源:发表于2019-07-29 16:57 被阅读0次
    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。

    相关文章

      网友评论

          本文标题:分布式事务回滚

          本文链接:https://www.haomeiwen.com/subject/yhzbrctx.html