DBA_2PC_PENDING
Oracle会自动处理分布事务,保证分布事务的一致性,所有站点全部提交或全部回滚。一般情况下,处理过程在很短的时间内完成,根本无法察觉到。
但是,如果在commit或rollback的时候,出现了连接中断或某个数据库站点CRASH的情况,则提交操作可能会无法继续,此时DBA_2PC_PENDING和DBA_2PC_NEIGHBORS中会包含尚未解决的分布事务。 对于绝大多数情况,当恢复连接或CRASH的数据库重新启动后,会自动解决分布式事务,不需要人工干预。只有分布事务锁住的对象急需被访问,锁住的回滚段阻止了其他事务的使用,网络故障或CRASH的数据库的恢复需要很长的时间等情况出现时,才使用人工操作的方式来维护分布式事务。 手工强制提交或回滚将失去二层提交的特性,Oracle无法继续保证事务的一致性,事务的一致性应由手工操作者保证
使用ALTER SYSTEM DISABLE DISTRIBUTED RECOVERY,可以使Oracle不再自动解决分布事务,即使网络恢复连接或者CRASH的数据库重新启动。
ALTER SYSTEM ENABLE DISTRIBUTED RECOVERY恢复自动解决分布事务。

Oracle解决异布lock的方法!
通常由于网络的不稳定或则数据库的 bug,在使用dblink时产生了异步lock,下面就谈谈异步lock的解决方法:
1)查询 dba_2pc_pending ,确定异步lock当前的状态。
select local_tran_id, global_tran_id, state, mix, host, commit#  fromdba_ 2pc_pending;

LOCAL_TRAN_ID|GLOBAL_TRAN_ID        |STATE    |MIX|HOST      |COMMIT#
-------------|----------------------|---------|---|----------|-------
1.10.255     |V817REP.BE.ORACLE.COM.|committed|no |BE-ORACLE-|202241
             |89f6eafb.1.10.255     |         |   |NT/bel449 |

此时通过state=committed, 表示此session已提 交,只是在提交后,接受不到global session的transaction信息了,所以产生异步lock,此时对一般不造成table的lock。
通过调用 execute DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('1.10.255'); 可解决此问题。
当然state还有以下几种状态:
collecting:在收集数据过程中,产生异常
解决方法: execute DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('1.10.255');

prepared: 在接受到异步commit/rollback指令前, 产生异常
解决方法: rollback force tran_id/commit force tran_id; -- 可根据异步transaction的状况决定使用方法。

forced rollback: 在使用rollback force出现
解决方法: execute DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('1.10.255');

forced commit:在使用commit force出现
解决方法: execute DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('1.10.255');

** NOTE1: If using Oracle 9i or later and DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY fails with
   ORA-30019: Illegal rollback Segment operation in Automatic Undo mode, use the following workaround

SQL> alter session set "_smu_debug_mode" = 4;
SQL>execute DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('local_tran_id');

测试:
模拟的是分布式事务在2pc提交过程产生in-doubt 的问题解决方式
环境:orcl(ORCL01.TEST.COM),solo(ORCL02.TEST.COM) version 10.2.0.3
15:45:29sys@SOLO > drop public database link solo_link;

数据库链接已删除。

15:45:57sys@SOLO >  create public database link solo_link connect to scott identified by scott using 'solo';

数据库链接已创建。

15:46:18sys@SOLO > updateemp@solo_link set sal=sal*2 ;

15:46:38sys@SOLO > commit;
如果这个时候solo出现网络故障。orcl执行commit 被挂起,这个时候如果网络恢复则问题会自动解决。
而这时如果却执行了一个shutdown abort
再启动之后,这个时候查询scott.emp表会报错:
ERROR at line 1:
ORA-01591: lock held by in-doubt distributed transaction 5.32.251

这个时候查询dba_2pc_pending数据字典会看到5.32.251 的state是prepared
并且同过查询dba_2pc_neighbors知道该事务对应的database是pu_link.test.com对应的数据库
SQL> col local_tran_id format a13
SQL> col global_tran_id format a30
SQL> col state format a8
SQL> col mixed format a3
SQL> col host format a10
SQL> col commit# format a10
SQL> select local_tran_id, global_tran_id, state, mixed, host, commit#
2 from dba_2pc_pending;
LOCAL_TRAN_ID GLOBAL_TRAN_ID                            STATE       MIX   HOST       COMMIT#
--------------------   ------------------------------------------     --------      ---    ----------   ----------
5.32.251               ORCL.TEST.COM.8705ca3e.5.32.251  prepared         no    dg1          498537

SQL> col local_tran_id format a13
SQL> col in_out format a6
SQL> col database format a25
SQL> col dbuser_owner format a15
SQL> col interface format a3
SQL> select local_tran_id, in_out, database, dbuser_owner, interface
2 from dba_2pc_neighbors;

LOCAL_TRAN_ID IN_OUT DATABASE                  DBUSER_OWNER    INT
--------------------    --------- -------------------------     ------------------          ---
5.32.251             in                                                SYS                           N
5.32.251               out         PU_LINK.TEST.COM     SYS                           C

这时候就需要使用手动提交或回滚  commit或者rollback
根据state列的值prepared我们知道,orcl是prepared阶段,则solo肯定不能到commit阶段.
为了事务的一致性最好 rollback force '5.32.251';
            
select local_tran_id, global_tran_id, state, mixed, host, commit#
2 from dba_2pc_pending;

LOCAL_TRAN_ID GLOBAL_TRAN_ID                            STATE         MIX HOST       COMMIT#
-------------             -------------------------------------------       -----------     ---   ----------     ----------
5.32.251               ORCL01.TEST.COM.8705ca3e.5.32. forced rollback  no    dg1
                             251

DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY('5.32.251');

DBA_2PC_PENDING (转)的更多相关文章

  1. 分佈式事務故障處理暨ORA-24756: transaction does not exist處理

    ORA-24756处理 看到警告日誌一直報ORA-24756錯誤 Errors in file /oracle/admin/NHMIX01/bdump/nhmix01_reco_4959.trc: O ...

  2. jdbc无法连接数据解析

    1.网络原因 2.账户权限问题 账户是否赋予以下的权限: grant connect, resource to ADM_BI; grant read, write on directory BACKU ...

  3. [Oracle][ODBC SQL Server Driver][SQL Server]对象名 'RECOVER.HS_TRANSACTION_LOG' 无效(转)

    原帖由 qingyun 于 2010-6-21 15:44 发表 在写pl/sql的时候,有个很重要的注意点:比如:begin  update  某个sqlserver的表@dblink名字 .... ...

  4. oracle分布式事务总结-转载

    基本概念 Local Coordinator:在分布事务中,必须参考其它节点上的数据才能完成自己这部分操作的站点. Global Coordinator:分布事务的发起者,负责协调这个分布事务. Co ...

  5. texedo 分布式事务

    1.问题现象 但是实际情况,完全出乎笔者的想法.检查一般对象数据表锁定,只需要检查v$locked_object和v$transaction视图,就可以定位到具体人.但是检查之后的结果如下: SQL& ...

  6. 浅述Oracle分布式事务概念

    着系统的复杂性不断增加,我们所面对的分布式系统渐渐增加.分布式文件系统.分布式消息队列系统等等层出不穷,在一些行业特别是互联网行业应用广泛.分布式数据库也是目前使用比较常用的分布式系统之一. 简单来说 ...

  7. ORACLE创建表空间 新建用户 授权

    --建表空间create tablespace <用户> datafile 'D:\oradatadev\<用户>.dbf' size 200mautoextend on ne ...

  8. 分布式事务2PC_PENDING异常处理

    set heading off;set feedback off;set echo off;Set lines 999;Spool rollback.sqlselect 'ROLLBACK FORCE ...

  9. Oracle 10.2.0.5升级至11.2.0.4

    参照MOS 官方文档Complete Checklist for Manual Upgrade to Oracle Database 11gR2 (11.2) (Doc ID 837570.1)一.升 ...

随机推荐

  1. Android支持Split Apks后,如何获得指定包名下的所有类

    从Android5.0以后,支持多个apk动态部署,这导致以前通过单一apk获取包路径下的所有类的方法失效,不过稍微修改一下原先的代码就可以,代码如下 public static final List ...

  2. postfix基于客户端的访问控制

    1.基于客户端的访问控制概览 postfix内置了多种反垃圾邮件的机制,其中就包括“客户端”发送邮件限制.客户端判别机制可以设定一系列客户信息的判别条件: smtpd_client_restricti ...

  3. Shell 命令行,实现对若干网站状态批量查询是否正常的脚本

    Shell 命令行,实现对若干网站状态批量查询是否正常的脚本 如果你有比较多的网站,这些网站的运行状态是否正常则是一件需要关心的事情.但是逐一打开检查那简直是一件太糟心的事情了.所以,我想写一个 sh ...

  4. 金三银四跳槽季,Java面试题大纲

    跳槽时时刻刻都在发生,但是我建议大家跳槽之前,先想清楚为什么要跳槽.切不可跟风,看到同事一个个都走了,自己也盲目的开始面试起来(期间也没有准备充分),到底是因为技术原因(影响自己的发展,偏移自己规划的 ...

  5. JavaScript class 使用

    /********************************************************************* * JavaScript class 使用 * 说明: * ...

  6. Linux操作系统设置SSH及SFTP通过密钥登录

    如果你使用过Linux操作系统的VPS或其他服务器,可能在登录时经常会提示你有多少次登录失败的记录. 这种登录失败的记录实际上也就是攻击者使用脚本自动扫描全网的IP然后进行筛选和测试,最终脚本会使用内 ...

  7. Android学习笔记之Android Studio添加新的Activity

    1.创建Android项目工程:AndroidTest 创建过程可参考网上诸多教程. 2.添加新的Activity,步骤如下 a. 在layout文件夹上右键,New-Activity-相应Activ ...

  8. HDU2604 Queuing 矩阵初识

    Queues and Priority Queues are data structures which are known to most computer scientists. The Queu ...

  9. spring beans 源码解读

    从把spring下下来,导入到eclipse,花了几个小时的时间. 本来壮志雄心的说要,满满深入学习研读spring源码,现在看来还是不太现实,太难懂了,各种依赖,说明都是英文,整个串起来理解,深入研 ...

  10. web安全知识

    参考文章 :  https://www.mudoom.com/php%E5%AE%89%E5%85%A8%E7%BC%96%E7%A0%81/ SQL注入 造成sql注入的原因是因为程序没有过滤用户输 ...