为啥 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 查询不启动事务? [甲骨文]的主要内容,如果未能解决你的问题,请参考以下文章
为啥 SELECT 在 SQL Server 中创建未提交的事务?