为啥 SELECT 查询不启动事务? [甲骨文]

Posted

技术标签:

【中文标题】为啥 SELECT 查询不启动事务? [甲骨文]【英文标题】:Why does not SELECT query start the transaction? [Oracle]为什么 SELECT 查询不启动事务? [甲骨文] 【发布时间】:2015-07-03 09:24:00 【问题描述】:

我正在尝试调试下一个 oracle 程序:

create or replace PROCEDURE CASE_6_TRANS_2
AS
   V_NUM NUMBER(38,0);
BEGIN
  SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
  SELECT COUNT(AE.ID) INTO V_NUM FROM AUDIT_EVENT AE WHERE ID=10; 
  COMMIT; --BREAKPOINT
END CASE_6_TRANS_2;

但是当我想在断点处查看当前事务时,V$TRANSACTION 表是空的。

documentation 说:

事务在遇到第一个可执行 SQL 语句时开始。可执行 SQL 语句是生成对数据库实例的调用的 SQL 语句,包括 DML 和 DDL 语句以及 SET TRANSACTION 语句。

根据documentationSELECT查询是DML

    事务是否开始但未显示在 V$TRANSACTION 中? 或者事务根本没有开始。如果不是,为什么?

【问题讨论】:

【参考方案1】:

事务以 SET TRANSACTION 开始,但 transaction_id 的分配延迟到第一个 DML(真正的 DML - 在我的经验中不是 SELECT 语句)

The same source says...

当事务开始时,Oracle 数据库将事务分配给可用的撤消数据段,以记录新事务的撤消条目。在分配撤消段和事务表槽之前不会分配事务 ID,这发生在第一个 DML 语句期间。

这对我来说很有意义,没有理由提交或回滚 SELECT。

【讨论】:

以上是关于为啥 SELECT 查询不启动事务? [甲骨文]的主要内容,如果未能解决你的问题,请参考以下文章

sql自动批量查询的问题

为啥会出现死锁?

为啥 SELECT 在 SQL Server 中创建未提交的事务?

平时使用oracle时,为啥会锁表

甲骨文。无法理解 FOR 如何与子查询 SELECT INTO 一起使用

《卸甲笔记》-子查询