[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;