我不是DBA,只是想了解一下Oracle的多版本并发模型。
在启动 DML 操作时,MVCC 协议的第一步是绑定一个 undo 段。问题是为什么一个撤消段只能服务于一个活动事务?
谢谢你的时间~~
“为什么一个撤消段只能服务于一个活动事务?”
这只是一个设计决策。这就是撤消段的设计方式。我想这样做是为了解决以前的回滚机制可能出现的一些问题。
回滚(仍然可用,但不赞成撤销)包括由 DBA 显式创建回滚段,并且可以将多个事务分配给单个回滚段。这有一些缺点,最明显的是,如果分配给给定段的一个事务生成足够的回滚数据,该段已满(并且不能再扩展),那么使用同一段的其他事务将无法执行任何会生成的操作回滚数据。
我推测新撤消功能的一个设计目标是防止这种事务间依赖。因此,他们设计了这种机制,以便 DBA 调整大小并创建撤消表空间,但其中的段管理由 Oracle 在内部完成。这允许每个事务使用专用段。如果表空间被填满(并且不能自动扩展),它们仍然可能相互导致问题,但在段级别,一个事务不可能导致另一个事务出现问题。
当谈到 Oracle 时,多版本并发可能是最重要的概念。程序员即使不想成为 DBA 也能理解它是有好处的。
除了这一点,还有几个方面,但它们都归结为效率:撤消管理是开销,因此最大限度地减少专用于它的周期数有助于数据库的整体性能。