Oracle:Truncates 是否在事务中保持原子性?

Oracle: do Truncates maintain Atomicity within a transaction?

Oracle 10g -- 由于与 9i 数据库的兼容性问题,我正在使用 INSERT INTO...SELECT 语句通过 10g 数据库(供 11g 数据库使用)提取数据每 15 分钟运行一次的预定作业。我注意到 TRUNCATE 语句比 DELETE 语句快得多,并且读到 'downside' 到 DELETE 语句是它们永远不会降低 table 高水位线。我对这些数据的使用纯粹是只读的——更新和插入永远不会针对有问题的 tables 发出。

鉴于上述情况,我想避免我的 'working' 数据库 (Oracle 11g) 尝试从我的登台数据库 (10g) 上的 table 读取空的情况一段时间,因为 TRUNCATE 立即发生,而来自 9i 数据库的 INSERT INTO...SELECT 需要几分钟才能完成。

所以,我想知道 Oracle 是否就是这样处理事务中的 TRUNCATE 的,或者是否执行了整个操作并提交了,尽管 TRUNCATE 无法回滚?或者,换句话说,从外部 SELECT 的角度来看,如果我在事务中的 table 上包装一个 TRUNCANTE 和 INSERT INTO...SELECT,table 对来自 table?

的外部 SELECT 读数显示为空

一旦 table 在事务中被截断,您就无法在同一事务中对该 table 执行任何其他操作;您必须提交(或回滚)事务,然后才能再次使用 table。或者,截断 table 可能会有效地终止当前事务。无论哪种方式,如果您使用 TRUNCATE,当 table 被截断(空)但 INSERT 操作尚未完成时,您会得到一个 window。这不是您想要的,但它是 Oracle 提供的。

您可以进行分区交换。在暂存中有 2 个分区 table; p_OLD 和 p_NEW.

  1. 在插入之前进行分区交换 "new"->"old" 并截断 "new" 分区。 (此时如果您从 table select 看到旧数据)
  2. 将数据插入 "new" 分区,截断 "old" 分区。 (此时你看到了新的数据)。

通过这种方法,您的 table 永远不会让旁观者感到空虚。

为什么需要 3 个 Oracle 环境?