关于oracle undo segment binding的问题

时间:2011-06-04 06:53:00

标签: oracle mvcc

我不是DBA,我只是想了解Oracle的多版本并发模型。

启动DML操作时,MVCC协议的第一步是绑定撤销段。问题是为什么一个撤销段只能用于一个活动事务?

谢谢你的时间~~

2 个答案:

答案 0 :(得分:1)

多版本并发可能是Oracle最重要的概念。即使程序员不想成为DBA,也很好理解它。

除此之外,还有一些方面,但它们都归结为效率:撤消管理是开销,因此最小化投入的周期数有助于数据库的整体性能。

  1. 事务可以包含许多语句并生成大量撤消:它可能会插入一行,它可能会删除三十万。最好在开始时分配一个空的UNDO块,而不是不断地寻找具有足够空间的部分填充块。
  2. 接下来,共享撤销块将要求内核以更精细的粒度跟踪使用情况,这只是增加了复杂性。
  3. 当事务完成时,撤消被释放(除非,见下一点)。事务使用的块越少,必须重置的锁存器越少。另外,如果块是共享的,我们必须释放块的分片,这只是更多的努力。
  4. 关于MVCC的关键是读取一致性。这意味着较长时间运行的查询返回的所有记录都将以查询开始时的状态显示。因此,如果我在EMP表上发出一个需要15分钟运行的SELECT,并且在中途提交所有工资的更新,我将看不到您的更改,数据库通过从您的事务使用的块中检索撤消数据来执行此操作。同样,当所有撤消数据在一个或两个块中并置时,这会容易得多。

答案 1 :(得分:1)

“为什么一个撤消段只能用于一个活动的交易?”

这只是一个设计决定。这就是撤消段的设计方式。我想这样做是为了解决以前的回滚机制可能出现的一些问题。

回滚(仍然可用但不赞成撤消)包括由DBA显式创建回滚段,并且可以将多个事务分配给单个回滚段。这有一些缺点,最明显的是,如果分配给给定段的一个事务生成了足够的回滚数据,该段已满(并且无法再扩展),那么使用相同段的其他事务将无法执行任何将生成的操作回滚数据。

我猜想新撤消功能的一个设计目标是防止这种事务间依赖。因此,他们设计了机制,以便DBA调整大小并创建撤消表空间,但其中的段管理由Oracle内部完成。这允许每次交易使用专用段。如果表空间填满(并且不能自动扩展),它们仍然可能导致彼此出现问题,但在段级别,一个事务不可能导致另一个事务出现问题。