与您的预期相反,看起来数据库链接是打开事务的来源。在 PL/SQL Developer 中对远程表运行 SELECT 查询时,我已经注意到了这样的行为。
引用 Tom Kyte(来源):
分布式的东西“以防万一”启动事务。
编辑:'任何 SQL 语句在 Oracle 中启动事务'?不,它没有,这里有一个演示。该演示使用数据字典视图V$TRANSACTION,其中列出了活动的事务。这一切都在我的本地 Oracle XE 数据库上运行,除了我之外没有其他用户连接到它。
在此演示期间,我们将使用下表。它仅包含一列:
SQL> 描述测试;
名称空?类型
----------------------------------------- -------- - --------------------------
一个数字(38)
SQL> 从 v$transaction 中选择计数(*);
计数(1)
----------
0
目前没有活跃的交易。让我们对这个表运行一个 SQL 查询:
SQL> 从测试中选择 *;
一种
----------
2
SQL> 从 v$transaction 中选择计数(*);
计数(1)
----------
0
仍然没有活跃的交易。现在让我们做一些将启动事务的事情:
SQL> 插入测试值 (1);
创建了 1 行。
SQL> 从 v$transaction 中选择计数(*);
计数(1)
----------
1
正如预期的那样,我们现在有一个活跃的交易。
SQL>提交;
提交完成。
SQL> 从 v$transaction 中选择计数(*);
计数(1)
----------
0
提交事务后,它不再处于活动状态。
现在,让我们创建一个数据库链接。我正在使用 Oracle XE,以下创建了一个从我的 Oracle XE 实例返回到自身的数据库链接:
SQL> 创建数据库链接 loopback_xe 使用“XE”连接到由密码标识的用户;
已创建数据库链接。
现在让我们看看当我们通过数据库链接从表中选择时会发生什么:
SQL> 从 v$transaction 中选择计数(*);
计数(1)
----------
0
SQL> select * from test@loopback_xe;
一种
----------
2
1
SQL> 从 v$transaction 中选择计数(*);
计数(1)
----------
1
如您所见,只需从远程表中选择即可打开一个事务。
我不确定这里到底有什么要提交或回滚,但我不得不承认不知道分布式事务的来龙去脉,答案可能就在其中。