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

再记分布式事务回滚

作者: Reiko士兵 | 来源:发表于2019-08-05 15:16 被阅读0次
  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数据库底层的东西。

相关文章

  • 再记分布式事务回滚

    Distributed Transactions in Prepared State Fails 之前写了一篇记录...

  • 分布式事务回滚

    分布式事务 ORA-01453 一、起因 用户请求批量回滚分布式事务,发来查询sql如下: 随后查出来一百多条结果...

  • seata源码阅读-AT模式

    demo用例 角色划分:TM: 事务管理,开启、提交、回滚分布式事务RM: 资源管理,注册、汇报、执资源,负责接收...

  • 事务相关的问题总结

    一、事务回滚问题 二、事务失效问题 三、事务失效的解决办法 方式一:自己手动创建事务,提交事务,回滚事务(Spri...

  • laravel transaction 数据库事务

    laravel 提供专门的闭包的数据库事务,可以自动回滚事务也可以手动回滚事务

  • @Transactional 解析与限制场景

    列表1事务不会回滚列表2事务不会回滚@Transactional 注解解析定义@Target({ElementTy...

  • mysql 事务回滚,online ddl

    回滚当事务中有DDL时,事务回滚会出错,当事务中只有DML时,回滚一般不会出问题DDL:新建表等操作DML:数据插...

  • 事务回滚

    情况1:如果没有在程序中手动捕获异常 情况2:如果在程序中自己捕获了异常 现在如果我们需要手动捕获异常,并且也希望...

  • seata代码控制回滚和临时挂起分布式事物

    一、说明 此处只是简单的记录一下,使用了 Seata后,如何手动 回滚分布式事物和临时挂起分布式事务,Seata的...

  • 数据库 | MySQL | 8. 事务

    begin:开启事务commit:确认/提交事务rollback:回滚事务

网友评论

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

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