Oracle:Truncates在事务中保持Atomicity吗?

时间:2015-05-22 02:45:37

标签: database oracle oracle11g transactions oracle10g

Oracle 10g - 由于9i数据库的兼容性问题,我通过一个预定的作业使用INSERT INTO ... SELECT语句通过10g数据库(由11g数据库使用)提取数据每15分钟一班。我注意到TRUNCATE语句比DELETE语句快得多,并且已经读到了“下行”语句。 DELETE语句是他们永远不会减少表高水位的。我对这些数据的使用纯粹是只读的 - 永远不会对相关表发布UPDATE和INSERT。

鉴于上述情况,我想避免可能的情况,即我的工作'数据库(Oracle 11g)尝试从我的临时数据库(10g)上的表中读取一段时间为空的表,因为TRUNCATE立即发生并且9i数据库中的INSERT INTO ... SELECT需要几分钟完成。

所以,我想知道Oracle是否在事务中处理TRUNCATEs,或者整个操作是否执行和COMMITted,尽管TRUNCATEs无法回滚?或者换句话说,从外部SELECT的角度来看,如果我在一个事务中的表上包装一个TRUNCANTE和INSERT INTO ... SELECT,那么该表对于从表中读取的外部SELECT是否会显示为空?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

您可以进行分区交换。在临时表中有2个分区; p_OLD和p_NEW。

  1. 在插入之前进行分区交换" new" - >" old"并截断" new"划分。 (此时,如果您从表中选择,您会看到旧数据)
  2. 将数据插入" new"分区,截断" old"划分。 (此时您会看到新数据)。
  3. 使用这种方法,你的表对旁观者来说永远不会是空的。

    为什么需要3个Oracle环境?