再记分布式事务回滚

  1. Distributed Transactions in Prepared State Fails

之前写了一篇记录分布式事务回滚的文章,事务状态为collecting,这次再记一次分布式事务回滚,事务状态为prepared。

一、事件描述

分布式事务的状态为prepared,正常情况下,可执行

rollback force 'local_tran_id';

进行回滚,其中的 local_tran_id 会在分布式事务报错时给出。查询字典 dba_2pc_pending 可以获得该分布式事务的详细信息

select * from dba_2pc_pending where local_tran_id='&local_tran_id';

但有时候,回滚命令会hang住执行不下去,查询会话等待事件,为“free global transaction table entry”。

二、解决方案

假设分布式事务的 local_tran_id6.12.399297,首先查询底层视图 x$ktuxe 中是否有该分布式事物的相关信息

SELECT ktuxeusn,
       ktuxeslt,
       ktuxesqn,
       ktuxesta status,
       ktuxecfl flags
FROM   x$ktuxe
WHERE  ktuxesta != 'inactive'
       AND ktuxeusn = 6
       AND ktuxeslt = 12
       AND ktuxesqn = 399297;

注意 ktuxeusn、ktuxeslt、ktuxesqn 与分布式事务 local_tran_id 之间对应的关系。
若查询 x$ktuxe 有输出,执行以下语句

delete from sys.pending_trans$ where local_tran_id = '6.12.399297';

delete from sys.pending_sessions$ where local_tran_id = '6.12.399297';

delete from sys.pending_sub_sessions$ where local_tran_id ='6.12.399297';

commit;

alter system disable distributed recovery;

随后,重新插入相关信息

INSERT INTO pending_trans$
            (local_tran_id,
             global_tran_fmt,
             global_oracle_id,
             state,
             status,
             session_vector,
             reco_vector,
             type#,
             fail_time,
             reco_time)
VALUES     ( '6.12.399297', /* <== Replace this with your local tran id */
             306206,
             '123.12345.1.2.3',
             'prepared',
             'p',
             Hextoraw('00000001'),
             Hextoraw('00000000'),
             0,
             sysdate,
             sysdate );
INSERT INTO pending_sessions$
VALUES     ( '6.12.399297',/* <==replace only this with your local tran id */
             1,
             Hextoraw('05004f003a1500000104'),
             'c',
             0,
             30258592,
             '',
             146 );

注意要commit

commit;

最后,回滚事务

rollback force '6.12.399297';
alter system enable distributed recovery;
三、结语

涉及到底层字典或视图的操作当慎之又慎,不到万不得已不要去动oracle数据库底层的东西。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、事务简介 ​ 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(u...
    逗逼程序员阅读 705评论 0 1
  • 小蚂蚁说: 分布式事务是企业集成中的一个技术难点,也是每一个分布式系统架构中都会涉及到的一个东西,特别是在这几年越...
    奥莉安娜的棒棒糖阅读 935评论 0 9
  • 好吧,这是我第一次在简书写文章,虽然现在不知道想写什么,但是我就是想写啦。哦,天哪,我要写什么呢。我踱步在...
    月上行人阅读 349评论 0 0
  • 作者:十七。 当你能在浮华中,不再取悦于人,不再在意别人的目光,而是甘愿独守一份清静,守住自己的心,你才能真正成为...
    十七_daeb阅读 1,422评论 0 6
  • 今天把flex所有内容看了一遍,觉得这真是好东西。 阮大大的博客: http://www.ruanyifeng.c...
    M_Jehol阅读 669评论 0 2