[20160818]關閉資料庫會話的dblink.txt

lfree發表於2016-08-19

[20160818]關閉資料庫會話的dblink.txt

--昨天在跟別人聊天提到說對方的資料庫出現session長時間存在事務無法提交的情況,問我什麼回事。
--實際上很簡單,問題很有可能出在使用dblink的情況,透過測試說明問題並且學習如何關閉連結。

1.環境:
SCOTT@book> @ &r/ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

create public database link "loopback"
connect to scott
identified by "book"
using '127.0.0.1/BOOK';

--我以前提到,這樣可以dblink的測試,滿足dblink的測試需求。

2.測試:
SCOTT@book> select count(*) from v$session where username='SCOTT';
  COUNT(*)
----------
         1
--注意測試前僅僅1個會話username='SCOTT'。

SCOTT@book> select * from dept@loopback;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

SCOTT@book> column XIDUSN_XIDSLOT_XIDSQN format a30
SCOTT@book> select dbms_transaction.local_transaction_id()   XIDUSN_XIDSLOT_XIDSQN from dual ;
XIDUSN_XIDSLOT_XIDSQN
------------------------------
10.11.1182

SCOTT@book> @ &r/xid
XIDUSN_XIDSLOT_XIDSQN
------------------------------
10.11.1182

    XIDUSN    XIDSLOT     XIDSQN     UBAFIL     UBABLK     UBASQN     UBAREC STATUS            USED_UBLK  USED_UREC XID              ADDR             START_DATE          C70
---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------------- ---------- ---------- ---------------- ---------------- ------------------- ----------------------------------------------------------------------
        10         11       1182          0          0          0          0 ACTIVE                    1          1 0A000B009E040000 000000008194F210 2016-08-19 09:43:27 ALTER SYSTEM DUMP UNDO BLOCK '_SYSSMU10_1197734989$' XID 10 11 1182;
                                                                                                                                                                          ALTER SYSTEM DUMP UNDO HEADER '_SYSSMU10_1197734989$';
                                                                                                                                                                          ALTER SYSTEM DUMP DATAFILE 0 BLOCK 0;
--很明顯執行dblink,會產生事務。

SCOTT@book> select count(*) from v$session where username='SCOTT';
  COUNT(*)
----------
         2
--現在變成了2個username='SCOTT'。        

--如果這個時候執行如下:
SCOTT@book> alter session close database link loopback;
ERROR:
ORA-02080: database link is in use

--必須要先commit。
SCOTT@book> commit ;
Commit complete.

SCOTT@book> select count(*) from v$session where username='SCOTT';
  COUNT(*)
----------
         2

SCOTT@book> alter session close database link loopback;
Session altered.

SCOTT@book> select count(*) from v$session where username='SCOTT';
  COUNT(*)
----------
         1

--要發一個commit,在執行後面的語句才能關閉alter session close database link loopback;。

總結:
1.使用dblink會執行事務。
2.如果應用大量使用dblink訪問資料庫,消耗的連線會很可觀,即使你commit,dblink的連線也沒有斷開,要關閉必須執行:
  commit或者rollback,才能執行alter session close database link loopback;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2123710/,如需轉載,請註明出處,否則將追究法律責任。

相關文章