为什么只从数据库视图中选择时会获得一个打开的事务?

如果我在pl / sql开发人员中对数据库表执行一个简单的select语句,我会得到一组标准的结果,如我所料。 最近,我从一个恰好从视图中选择的存储过程粘贴了一个查询,并注意到一个事务似乎保持打开状态。 PL / SQL开发人员可以使用回滚和提交选项。 对其他开发人员的调查显示,这似乎影响了一些但不影响其他人,这导致我怀疑PL / SQL Developer设置。 为什么会这样呢?视图itelf有一个DBLink到另一个数据库,但我不希望这会产生任何影响。 有什么想法吗?     
已邀请:
任何SQL语句都在Oracle中启动事务。 从手册:   事务以第一个可执行SQL语句开头。事务在提交或回滚时结束,显式使用COMMIT或ROLLBACK语句,或者在发出DDL语句时隐式执行。 [...]可执行SQL语句是一种SQL语句,它生成对实例的调用,包括DML和DDL语句 很可能那些没有看到它的人正在自动提交模式下运行,其中语句启动的事务在语句结束后立即提交。 其他人声称
SELECT
不是DML,但该手册再次明确指出: 数据操纵语言(DML)语句查询或操纵现有模式对象中的数据。它们使您能够:     *从一个或多个表或视图中检索或获取数据(SELECT)     *将新行数据添加到表或视图中(INSERT) [...]     
与您的期望相反,看起来数据库链接是开放交易的来源。在PL / SQL Developer中对远程表运行SELECT查询之前,我注意到了这样的行为。 引用Tom Kyte(来源):   分布式东西启动事务“以防万一”。 编辑:'任何SQL语句在Oracle中启动事务'?不,它没有,这是一个演示。此演示使用数据字典视图V $ TRANSACTION,其中列出了活动事务。这都在我的本地Oracle XE数据库上运行,该数据库除了我之外没有其他用户连接到它。 我们将在演示期间使用下表。它只包含一列: SQL> desc测试;  名字空?类型  ----------------------------------------- -------- - ---------------------------  一个数字(38) SQL>从v $ transaction中选择count(*);   COUNT(1) ----------          0 目前没有活跃的交易。让我们对这个表运行一个SQL查询: SQL> select * from test;          一个 ----------          2 SQL>从v $ transaction中选择count(*);   COUNT(1) ----------          0 仍然没有活跃的交易。现在让我们做一些会启动交易的事情: SQL>插入测试值(1); 已创建1行。 SQL>从v $ transaction中选择count(*);   COUNT(1) ----------          1 正如所料,我们现在有一个活跃的交易。 SQL> commit; 提交完成。 SQL>从v $ transaction中选择count(*);   COUNT(1) ----------          0 提交交易后,它不再有效。 现在,让我们创建一个数据库链接。我正在使用Oracle XE,以下内容创建了一个从我的Oracle XE实例返回自身的数据库链接: SQL> create database link loopback_xe使用'XE'连接到用密码标识的用户; 数据库链接已创建 现在让我们看看当我们通过数据库链接从表中选择时会发生什么: SQL>从v $ transaction中选择count(*);   COUNT(1) ----------          0 SQL> select * from test @ loopback_xe;          一个 ----------          2          1 SQL>从v $ transaction中选择count(*);   COUNT(1) ----------          1 如您所见,只需从远程表中选择即可打开一个事务。 我不确定在这里提交或回滚到底是什么,但我不得不承认不知道分布式事务的来龙去脉,答案可能就在其中。     
您绝对无法使用普通查询严格打开事务。您可以通过数据库链接打开一个。那个故意或完全粗心地发布了医生链接的人遗漏了第二句话。   “Oracle数据库中的事务在第一个可执行SQL时开始   声明遇到了。可执行的SQL语句是SQL   生成对实例的调用的语句,包括DML和DDL   声明“。 SELECT既不是DML也不是DDL。实际测试这个也是TRIVIAL。我不想在这里像一个巨魔一样脱落,但当人们只是在论坛上抛出答案试图获得积分并且答案完全是垃圾时,它真的很烦人。 阅读文档的其余部分并首先测试。 登录会话 运行一个选择 通过将
v$Session
(对于您的会话)加入
v$transaction
来查看您是否有未结交易。 如果记录返回,则表示您有交易。如果没有,你就不会。     
请注意,根据Oracle 11g管理指南,如果您在数据库链接上执行普通的旧SELECT,您将启动一个需要提交(或回滚)的事务。     

要回复问题请先登录注册