Oracle database link中查询会开启事务吗?
关于oracle database link,使用database link相关的查询语句是否会开启事务呢?我们知道,在数据库中一个简单的SELECT查询语句不会产生事务(select for update会产生事务)。如下测试所示:

我们首先准备测试环境,创建了一个database link: LINK_NODEFINE_TEST,然后我们开始测试
CREATE PUBLIC DATABASE LINK LINK_NODEFINE_TEST
CONNECT TO TEST IDENTIFIED BY "t123$%^"
USING '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.20.57.24)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = gsp.localdomain)
)
)';
下面开始演示一下database link相关的查询是否会开启事务:
SQL> show user;
USER is "SYS"
SQL> select userenv('sid') from dual;
USERENV('SID')
--------------
939
SQL> select xidusn, xidslot, xidsqn
2 from v$transaction, v$session
3 where saddr=ses_addr;
no rows selected
SQL> select * from kerry@link_nodefine_test;
ID NAME
---------- --------------------------------
100 kerry
SQL> select xidusn, xidslot, xidsqn
2 from v$transaction, v$session
3 where saddr=ses_addr;
XIDUSN XIDSLOT XIDSQN
---------- ---------- ----------
3 14 4122050
SQL> alter session close database link link_nodefine_test;
ERROR:
ORA-02080: database link is in use
SQL> commit; --必须要先commit,才能关闭链接
Commit complete.
SQL> alter session close database link link_nodefine_test;
Session altered.
下面我们创建一个账号TEST,测试验证database link所指向远程数据库中会话的生存周期,简单测试,你会发现即使一个简单查询(包含database link),会在远程数据库生成一个会话。而且如果不执行alter session close database link xxx关闭对应的database link的话,该会话不会销毁,而是变成INACTVIE状态。直到其触发了TCP keepalive相关机制后才会被数据库清理。

一旦你执行了database link相关的查询, 那么在远程数据库(10.20.57.24)这个测试服务器的数据库实例中,就会生成对应的会话,而且只有在原数据库执行了“alter session close database link link_nodefine_test"后,对应的会话才会销毁(当然,触发了TCP keepalive相关机制后也会被数据库清理)。有兴趣可以自行测试。
SQL> select count(*) from v$session where username='TEST';
COUNT(*)
----------
1
SQL> select count(*) from v$session where username='TEST';
COUNT(*)
----------
0
SQL>
那么问题来了,如果我在会话当中多次使用select * from kerry@link_nodefine_test这类包含database link的语句,是否会在10.20.57.24生成多个会话呢? 还是说这个database link相关的会话会复用呢? 下面我们测试验证一下:
如下所示,同一个会话当中多次使用database link查询,不会在10.20.57.24生成多个会话。 但是如果多个不同会话中都使用database link link_nodefine_test的话,那么就会在(10.20.57.24)中生成多个会话。

那么如果在同一个会话中,使用不同的database link,但是这两个database link使用相同的账号,指向相同的服务器,那么这个是否也共用一个会话呢?答案是不会,而是会生成新的会话。如下测试所示
CREATE PUBLIC DATABASE LINK LINK_DEDIATED_TEST
CONNECT TO TEST IDENTIFIED BY "t123$%^"
USING '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.20.57.24)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = gsp.localdomain)
)
)';

关于dblink的查询为什么产生事务的原理分析,参考官方文档Transaction Processing in a Distributed System
Two-Phase Commit Mechanism
A database must guarantee that all statements in a transaction, distributed or non-distributed, either commit or roll back as a unit. The effects of an ongoing transaction should be invisible to all other transactions at all nodes; this transparency should be true for transactions that include any type of operation, including queries, updates, or remote procedure calls.
The general mechanisms of transaction control in a non-distributed database are discussed in the Oracle Database Concepts. In a distributed database, the database must coordinate transaction control with the same characteristics over a network and maintain data consistency, even if a network or system failure occurs.
The database two-phase commit mechanism guarantees that all database servers participating in a distributed transaction either all commit or all roll back the statements in the transaction. A two-phase commit mechanism also protects implicit DML operations performed by integrity constraints, remote procedure calls, and triggers.
总结:
Oracle数据库中使用dblink的相关查询语句会产生事务, 如果有大量会话使用dblink的话,会在远程数据库产生大量的会话,有时候消耗的连接数量会非常可观。对于dblink在远程数据库的会话,必须先在本地数据库的当前会话commit,然后alter session close database link xxx, 关闭dblink,如果不执行这些操作,只能靠DCD或Tcp KeepLive机制触发数据库销毁会话。
参考资料:
https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:393468893370
http://blog.itpub.net/267265/viewspace-2123710/
https://docs.oracle.com/cd/B28359_01/server.111/b28310/ds_concepts004.htm#ADMIN12120
Oracle database link中查询会开启事务吗?的更多相关文章
- oracle Database Link
1 Database Link 的创建: 有两个数据库服务器A/B, 其中A的IP地址为172.20.36.245, 服务器B为本机.服务器B上的数据库实例名为ORCL,在本机上的服务监听配置上有服务 ...
- Oracle DATABASE LINK(DBLINK)创建
数据库全局名称可以用以下命令查出: SELECT * FROM GLOBAL_NAME; 修改可以用以下语句来修改参数值: ALTER SYSTEM SET GLOBAL_NAME=TRUE/FALS ...
- ora-01017 和oracle database link
DB link ,创建完了后总是报密码错误.我感到奇怪.明明密码是对的.怎么可能错误呢. SQL> create public database link kk40 connect to khf ...
- Oracle Database Link 连接数据库复制数据
--1. 创建dblink连接 create database link mdm66 connect to lc019999 identified by aaaaaa using '10.24.12. ...
- Oracle Database Link 的创建和使用小见
假设:需要从数据库db_a通过db_link连接到db_b查询数据库b的部分相关信息 前提条件: 数据库a账户需要有创建dblink的权限,如果没有可以使用dba账户赋权限 grant CREATE ...
- 07 模型层 orm相关查询 F查询Q查询 django开启事务
一.Django终端打印SQL语句 如果你想知道你对数据库进行操作时,Django内部到底是怎么执行它的sql语句时可以加下面的配置来查看 在Django项目的settings.py文件中,在最后复制 ...
- ORACLE与mysql中查询第n条到第m条的数据记录的方法
ORACLE: SELECT * FROM ( SELECT 表名.*, ROWNUM AS CON FROM 表名 WHERE ROWNUM ...
- oracle Database link 创建
http://www.cnblogs.com/yhason/p/3735319.html
- 事务的隔离级别,mysql中开启事务、django中开启事务
目录 一.事务的特性 二.数据库中开启事务 三.Django中开启事务的两种方式 第一种 第二种 四.事务的隔离级别 隔离级别 如何查看mysql隔离级别? 修改事务的隔离级别 隔离级别解释 read ...
随机推荐
- [Swift]LeetCode894. 所有可能的满二叉树 | All Possible Full Binary Trees
A full binary tree is a binary tree where each node has exactly 0 or 2 children. Return a list of al ...
- [Swift]LeetCode966.元音拼写检查器 | Vowel Spellchecker
Given a wordlist, we want to implement a spellchecker that converts a query word into a correct word ...
- Python内置函数(14)——delattr
英文文档: delattr(object, name) This is a relative of setattr(). The arguments are an object and a strin ...
- 『字典树 trie』
字典树 (trie) 字典树,又名\(trie\)树,是一种用于实现字符串快速检索的树形数据结构.核心思想为利用若干字符串的公共前缀来节约储存空间以及实现快速检索. \(trie\)树可以在\(O(( ...
- 面试小知识:MySQL索引相关
前言 本模板主要是一些面试相关的题目,对于每一道问题,我会提供简单的解答,答案的来源主要是基于自己看了各方资料之后的理解,如果有错的,欢迎指点出来. 1. 什么是最左前缀原则? 以下回答全部是基于My ...
- 面试 Linux 运维工作至少需要知道哪些知识?
前言 我们已经发过不少 Linux 面试题,但是单独的面试题总感觉会过于零碎,没有体系化内容给人的帮助大. 知乎上有这样一个问题:一个新手面试 Linux 运维工作至少需要知道哪些知识?其中有一个答案 ...
- vue-eleme 学习笔记
# watch 用法 (1).普通的watch <div style="margin-top: 60px;"> {{common}} <button @clic ...
- SpringCloud Config客户端
SpringCloud Config服务端 1.导入依赖 <dependency> <groupId>org.springframework.cloud</groupI ...
- css加载会造成阻塞吗
本文由云+社区发表 作者:嘿嘿嘿 可能大家都知道,js执行会阻塞DOM树的解析和渲染,那么css加载会阻塞DOM树的解析和渲染吗?接下来,我就来对css加载对DOM树的解析和渲染的影响做一个测试. 为 ...
- Mybatis学习(六)————— Spring整合mybatis
一.Spring整合mybatis思路 非常简单,这里先回顾一下mybatis最基础的根基, mybatis,有两个配置文件 全局配置文件SqlMapConfig.xml(配置数据源,全局变量,加载映 ...