在使用PL/SQL developer里面查dblink,commit和rollback会亮。原因是什么呢?
做一些测试可以发现一些规律:
select count(1) from test@dblink; --不会产生要commit提示
select * from test@dblink; --会产生要commit提示
select * from test@dblink where rownum<5; --不会产生要commit提示
当需要的数据都返回了,就不会产生要commit提示,否则就会产生commit提示。
为什么会这样呢?数据库把这个远程查询当做一个分布式事务了,实验:
session1:
SQL> select sid from v$mystat where rownum =1;
SID
----------
132
SQL> select * from test@dblink;--执行之后,commit按钮要提交
session2:
SQL> select s.sid,
s.serial#,
s.sql_hash_value,
r.segment_name,
t.xidusn,
t.xidslot,
t.xidsqn
from v$session s, v$transaction t, dba_rollback_segs r
where s.taddr = t.addr
and t.xidusn = r.segment_id(+);
SID SERIAL# SQL_HASH_VALUE SEGMENT_NAME XIDUSN XIDSLOT XIDSQN
---- ---------- -------------- ------------------------------ ---------- ---------- --------
132 44205 0 _SYSSMU7_4222772309$ 7 22 14521
可以再做一个实验,建一张本地的test表,查询没有显示完数据,与上述实验的区别就是少了@dblink,你会发现本地查询是没有事务的。