IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    如何查找正在进行的分布式事务

    小荷发表于 2015-10-16 08:44:42
    love 0

    分别在local instance的两个session中执行:

    --在一个session:
    select * from t1@ora9i for update;
     
    --在另一个session:
    delete from t2@ora9i where rownum
    <=3;

    如何查找正在进行的分布式事务,可以用下面的几种方法:

    (1)语句如下:

    select username, osuser, status, sid, serial#, machine, process, terminal, program
    from v$session
    where saddr in (select k2gtdses from sys.x$k2gte );

    显式结果:

    SQL> select username, osuser, status, sid, serial#, machine, process, terminal, program
      2  from v$session
      3  where saddr in (select k2gtdses from sys.x$k2gte);
     
    USERNAME                       OSUSER                         STATUS          SID    SERIAL# MACHINE      PROCESS      TERMINAL                       PROGRAM
    ------------------------------ ------------------------------ -------- ---------- ---------- ---------------------------------------------------------------- ------------ ------------------------------ ------------------------------------------------
    SYS                            jijihe                         INACTIVE        141         14 CN-ORACLE\HE-PC      7876:9000    HE-PC                          plsqldev.exe
    SYS                            jijihe                         INACTIVE        145          2 CN-ORACLE\HE-PC      7876:9000    HE-PC                          plsqldev.exe
     
    SQL>

    (2)语句如下:

    [oracle10g@testdb tmp]$ cat chk_dx.sql
    REM distri.sql
    column origin format a13
    column GTXID format a35
    column LSESSION format a10
    column s format a1
    column waiting format a15
    Select /*+ ORDERED */
    substr(s.ksusemnm,1,10)||'-'|| substr(s.ksusepid,1,10) "ORIGIN",
    substr(g.K2GTITID_ORA,1,35) "GTXID",
    substr(s.indx,1,4)||'.'|| substr(s.ksuseser,1,5) "LSESSION" ,
    substr(decode(bitand(ksuseidl,11),
    1,'ACTIVE',
    0, decode(bitand(ksuseflg,4096),0,'INACTIVE','CACHED'),
    2,'SNIPED',
    3,'SNIPED', 'KILLED'),1,1) "S",
    substr(event,1,10) "WAITING"
    from x$k2gte g, x$ktcxb t, x$ksuse s, v$session_wait w
    -- where g.K2GTeXCB =t.ktcxbxba
    <= use this if running in Oracle7
    where g.K2GTDXCB =t.ktcxbxba -- comment out if running in Oracle8 or later
    and g.K2GTDSES=t.ktcxbses
    and s.addr=g.K2GTDSES
    and w.sid=s.indx;
     
    REM distri_details.sql
    set headin off
    select /*+ ORDERED */
    '
    ----------------------------------------'||'
    Curent Time : '|| substr(to_char(sysdate,'dd-Mon-YYYY HH24.MI.SS'),1,22) ||'
    '||'
    GTXID='||substr(g.K2GTITID_EXT,1,10) ||'
    '||'
    Ascii GTXID='||g.K2GTITID_ORA ||'
    '||'
    Branch= '||g.K2GTIBID ||'
    Client Process ID is '|| substr(s.ksusepid,1,10)||'
    running in machine : '||substr(s.ksusemnm,1,80)||'
    Local TX Id ='||substr(t.KXIDUSN||'.'||t.kXIDSLT||'.'||t.kXIDSQN,1,10) ||'
    Local Session SID.SERIAL ='||substr(s.indx,1,4)||'.'|| s.ksuseser ||'
    is : '||decode(bitand(ksuseidl,11),1,'ACTIVE',0,
    decode(bitand(ksuseflg,4096),0,'INACTIVE','CACHED'),
    2,'SNIPED',3,'SNIPED', 'KILLED') ||
    '
    and '|| substr(STATE,1,9)||
    '
    since '|| to_char(SECONDS_IN_WAIT,'9999')||' seconds' ||'
    Wait Event is :'||'
    '||
    substr(event,1,30)||' '||p1text||'='||p1
    ||','||
    p2text||'='||p2
    ||','||
    p3text||'='||p3 ||'
    Waited '||to_char(SEQ#,'99999')||' times '||'
    Server for this session:' ||decode(s.ksspatyp,1,'Dedicated Server',
    2,'Shared Server',3,
    '
    PSE','None') "Server"
    from x$k2gte g, x$ktcxb t, x$ksuse s, v$session_wait w
    -- where g.K2GTeXCB =t.ktcxbxba <= use this if running Oracle7
    where g.K2GTDXCB =t.ktcxbxba -- comment out if running Oracle8 or later
    and g.K2GTDSES=t.ktcxbses
    and s.addr=g.K2GTDSES
    and w.sid=s.indx;
    set headin on
    -- end script

    显示结果:

    SQL> @chk_dx.sql
     
    ORIGIN        GTXID                               LSESSION   S WAITING
    ------------- ----------------------------------- ---------- - ---------------
    CN-ORACLE\-78 ORA10G.7859469f.7.29.136            141.14     I SQL*Net me
    76:9000
     
    CN-ORACLE\-78 ORA10G.7859469f.6.23.128            145.2      I SQL*Net me
    76:9000
     
     
     
    ----------------------------------------
    Curent Time : 16-Oct-2015 16.30.39
    GTXID=4F52413130
    Ascii GTXID=ORA10G.7859469f.7.29.136
    Branch= 0000
    Client Process ID is 7876:9000
    running in machine : CN-ORACLE\HE-PC
    Local TX Id =7.29.136
    Local Session SID.SERIAL =141.14
    is : INACTIVE and WAITING since   354 seconds
    Wait Event is :
    SQL*Net message from client driver id=1413697536,#bytes=1,=0
    Waited     60 times
     
    Server for this session:Dedicated Server
     
    ----------------------------------------
    Curent Time : 16-Oct-2015 16.30.39
    GTXID=4F52413130
    Ascii GTXID=ORA10G.7859469f.6.23.128
    Branch= 0000
    Client Process ID is 7876:9000
    running in machine : CN-ORACLE\HE-PC
    Local TX Id =6.23.128
    Local Session SID.SERIAL =145.2
    is : INACTIVE and WAITING since   492 seconds
    Wait Event is :
     
    SQL*Net message from client driver id=1413697536,#bytes=1,=0
    Waited    216 times
    Server for this session:Dedicated Server
     
     
    SQL>

    (3)对于XA 事务,我们也能这样查:

    语句如下:

    [oracle10g@testdb tmp]$ cat get_xa_stat.sql
    set pagesize 1000
     
    prompt +++ In memory transaction +++
    select /*+ ORDERED */
    ''||'
    Curent Time : '|| substr(to_char(sysdate,' HH24.MI.SS'),1,22) ||'
    '||'TX start_time: '||t.KTCXBSTM||'
    '||'FORMATID: '||g.K2GTIFMT ||'
    '||'GTXID: '||g.K2GTITID_EXT ||'
    '||'Branch: '||g.K2GTIBID ||'
    Local_Tran_Id ='||substr(t.KXIDUSN||'.'||t.kXIDSLT||'.'||t.kXIDSQN,1,15)||'
    '||'KTUXESTA='|| x.KTUXESTA ||'
    '||'KTUXEDFL='|| x.KTUXECFL ||'
    Lock_Info: ID1: ' || ((t.kXIDUSN*64*1024)+ t.kXIDSLT)
    ||' ID2: '|| t.kXIDSQN
    XA_transaction_INFO
    from x$k2gte g, x$ktcxb t, x$ktuxe x
    where g.K2GTDXCB =t.ktcxbxba and
    x.KTUXEUSN = t.KXIDUSN(+) and
    x.KTUXESLT = t.kXIDSLT(+) and
    x.KTUXESQN =t.kXIDSQN(+);
     
    prompt +++ Timed out, prepared XA transactions +++
    select global_tran_fmt, global_foreign_id, branch_id,state,
    tran.local_tran_id
    from sys.pending_trans$ tran, sys.pending_sessions$ sess
    where tran.local_tran_id = sess.local_tran_id
    and tran.state = 'prepared'
    and dbms_utility.is_bit_set(tran.session_vector, sess.session_id)=1;
    [oracle10g@testdb tmp]$

    显示结果:

    SQL> @get_xa_stat
    +++ In memory transaction +++
     
    XA_TRANSACTION_INFO
    --------------------------------------------------------------------------------
     
    Curent Time :  16.38.13
    TX start_time: 10/16/15 16:24:39
    FORMATID: 306206
    GTXID: 4F52413130472E37383539343639662E372E32392E313336
    Branch: 0000
    Local_Tran_Id =7.29.136
    KTUXESTA=ACTIVE
    KTUXEDFL=NONE
    Lock_Info: ID1: 458781 ID2: 136
     
     
    Curent Time :  16.38.13
    TX start_time: 10/16/15 16:22:24
    FORMATID: 306206
    GTXID: 4F52413130472E37383539343639662E362E32332E313238
    Branch: 0000
    Local_Tran_Id =6.23.128
    KTUXESTA=ACTIVE
    KTUXEDFL=NONE
    Lock_Info: ID1: 393239 ID2: 128
     
     
    +++ Timed out, prepared XA transactions +++
     
    no rows selected
     
    SQL>

    参考:
    How to identify a session started by a remote distributed transaction? (Doc ID 332326.1)
    Script to show Active Distributed Transactions (Doc ID 104420.1)
    Solving locking problems in a XA environment (Doc ID 1248848.1)



沪ICP备19023445号-2号
友情链接