在 Oracle 中,关于自治事务中数据可见性的说法正确的是:
A
自治事务对主事务的可见性完全取决于自治事务的隔离级别。
B
自治事务对主事务的可见性完全取决于主事务的隔离级别。
C
自治事务可以看到主事务已提交的数据。
D
自治事务可以看到主事务未提交的数据。
在 Oracle 中,关于自治事务(Autonomous Transactions)的数据可见性规则如下:
⚖️ 正确答案分析
C. 自治事务可以看到主事务已提交的数据。
B. 自治事务对主事务的可见性完全取决于主事务的隔离级别。(需结合主事务隔离级别理解)
🔍 详细解析 自治事务的核心特性
自治事务通过 PRAGMA AUTONOMOUS_TRANSACTION 声明,与主事务完全独立:
主事务未提交的数据对自治事务不可见
自治事务启动时,只能看到主事务已提交的数据修改,无法感知主事务未提交的变更。
示例:若主事务插入数据但未提交,自治事务查询该表时结果为空。
自治事务的提交/回滚不影响主事务
自治事务内部操作(如插入日志)可独立提交,即使主事务回滚,自治事务的数据仍保留。
主事务隔离级别决定其对自治事务数据的可见性
自治事务提交的数据对主事务是否可见,取决于主事务的隔离级别:
READ COMMITTED(Oracle 默认):
主事务可立即看到自治事务提交的数据。
SERIALIZABLE:
主事务在提交前看不到自治事务提交的数据,仅能看到事务开始前的数据快照。
错误选项排除
A. 自治事务对主事务的可见性取决于自治事务的隔离级别
❌ 错误。自治事务的可见性规则固定(仅可见主事务已提交数据),不受自身隔离级别影响。
D. 自治事务可以看到主事务未提交的数据
❌ 错误。自治事务无法访问主事务未提交的任何修改。
💎 总结 选项 正确性 说明 A ❌ 自治事务的可见性规则固定,不依赖其隔离级别 B ✅ 主事务是否看到自治事务的数据,由主事务隔离级别决定 C ✅ 自治事务始终只能看到主事务已提交的数据 D ❌ 自治事务无法看到主事务未提交的数据
关键结论:
自治事务是一个独立的事务单元,它与主事务的交互遵循 “单向可见” 规则:
自治事务 → 主事务:取决于主事务的隔离级别(READ COMMITTED 可见,SERIALIZABLE 不可见);
主事务 → 自治事务:仅主事务已提交的数据可见。
若需验证,可通过以下示例测试:
-- 主事务 INSERT INTO main_table VALUES (1); -- 未提交 CALL autonomous_proc(); -- 自治事务中查询 main_table,结果为空 COMMIT; -- 主事务提交后,自治事务新增数据对主事务可见(READ COMMITTED)




