为什么SELECT查询没有启动事务? [甲骨文]

时间:2015-07-03 09:24:00

标签: oracle transactions

我正在尝试调试下一个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语句。

根据documentation SELECT 查询是 DML

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

1 个答案:

答案 0 :(得分:3)

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

The same source says...

  

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

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