暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

dblink的事务

四海内皆兄弟 2022-03-15
1882

   最近遇到这个问题,大家比较纠结。今天我们首先说说为什么会有dblink这个需求。从前因为要解决两个Oracle数据库之间的数据关联。因为两个数据库是不同的IP,数据关联要跨网络的。网络的消耗很大。所以这种方式不推荐,甚至是反对。有没有办法能避免跨网络查询?答案是有的:通过物化视图把数据进行本地的落地。这样两个数据库直接的数据只在间隔时间内进行一下差异补偿。

    不过这个又带来一个问题,如果要同步的表很多怎么办?这一个两个的还行。多了实在不行。我见过50个表5秒同步一次。数据库压力很大。最终采用了OGG的方式替代物化视图,两边数据库压力都下降了40%。

     可见即使是同构数据库跨网络效果也不好。(再次说明单机是多么幸福的一件事)

   那么以上说的都是从前,而现在情况有变。在PDB模式下,dblink没有网络开销,是不是可以了呢?技术上可以。不过又引申出来一个问题。就是使用dblink查询时候显示有事务。为什么呢?因为要求各个数据库之间的一致性。今天我们看看这个事务会不会带来锁。

   登录第一个PDB查看数据。PDB6

登录第二个PDB查看数据。PDB7

登录第三个PDB查看数据。PDB8

在PDB8上建立到PDB6的dblink p6

在PDB8上建立到PDB7的dblink p7

根据执行计划看到了remote的远程。

在PDB8上进行查询,可以看到没有事务。

但是如果是全表查询,就显示了事务。这其中的原因暂时不明白。先放一下。

我们主要验证会不会引起锁。在PDB7上把第二行数据改一下,然后不提交。

在PDB8上,没有看到。(因为没有提交,看不到正常)

当PDB7上提交以后

PDB8可以查询出结果。

   结论引用网上原话:

    Oracle数据库中使用dblink的相关查询语句会产生事务,如果有大量会话使用dblink的话,会在远程数据库产生大量的会话,有时候消耗的连接数量会非常可观。对于dblink在远程数据库的会话,必须先在本地数据库的当前会话commit,然后alter session close database link xxx, 关闭dblink,如果不执行这些操作,只能靠DCDTcp KeepLive机制触发数据库销毁会话。

    就是说会有连接数的消耗,需要应用去主动关闭,如果不主动关闭,最终数据库会来关闭。

文章转载自四海内皆兄弟,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论