当前位置: 代码迷 >> 综合 >> ORA-01591:nbsp;locknbsp;heldnbsp;bynbsp;in-doubt…
  详细解决方案

ORA-01591:nbsp;locknbsp;heldnbsp;bynbsp;in-doubt…

热度:10   发布时间:2023-12-20 10:08:45.0

总结:from 老白  http://www.oraclefans.cn/forum/showblog.jsp?rootid=7153

1、对于ORA-1591,一般来说是由于分布式事务失败引起的。强制提交或者回退分布式事务就可以解决问题

2、有些时候分布式事务自动的回退会失败,这样就会导致1591相关的表被锁住

3、这个时候分为两种情况,首先通过

     SELECT KTUXEUSN, KTUXESLT, KTUXESQN,
           KTUXESTA Status,
           KTUXECFL Flags
    FROM x$ktuxe
    WHERE ktuxesta!='INACTIVE'
          AND ktuxeusn in =108;

 确认事务的状态,如果显示是:
  KTUXEUSN   KTUXESLT   KTUXESQN STATUS           FLAGS                                                                            
---------- ---------- ---------- ---------------- ------------------------                                                         
       108         28      46269 PREPARED         SCO|COL|REV|DEAD 
说明事务需要回退或者提交。

此时如果DBA_2PC_PENDING中有该记录,但是状态不是PREPARED,那么就

 UPDATE PENDING_TRANS$ SET        STATE='prepared',
        STATUS ='P'
where local_tran_id='73.11.124822';
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( '108.28.46269',
        306206,                 
        'XXXXXXX.12345.1.2.3',  
        'prepared','P',         
        hextoraw( '00000001' ), 
        hextoraw( '00000000' ), 
        0, sysdate, sysdate );

    insert into pending_sessions$
    values( '108.28.46269',
        1, hextoraw('05004F003A1500000104'),
        'C', 0, 30258592, '',
        146
      );

    commit;

插入相关记录。

然后进行ROLLBACK FORCE  'TX-ID'或者COMMIT  FORCE 'TX-ID'

如果ROLLBACK 不成功,可以尝试COMMIT

  相关解决方案