【问题标题】: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

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

【问题讨论】:

    标签: oracle transactions


    【解决方案1】:

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

    The same source says...

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多