首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle:截断是否在事务中保持原子性?

Oracle:截断是否在事务中保持原子性?
EN

Stack Overflow用户
提问于 2015-05-22 02:45:36
回答 2查看 228关注 0票数 0

Oracle10g --由于与9i数据库的兼容性问题,我使用INSERT INTO...SELECT语句通过每15分钟运行一次的计划作业,通过10g数据库(将由11g数据库使用)从10g数据库中提取数据。我注意到TRUNCATE语句比DELETE语句快得多,并且已经读到了DELETE语句的一个‘缺点’就是它们永远不会减少表中的高水标记。我对这些数据的使用纯粹是只读的--更新和插入从来不会针对这些表发出。

鉴于以上所述,我希望避免出现这样的情况:我的“工作”数据库(Oracle11g)试图从临时数据库(10g)上的一个表中读取数据,该表在一段时间内是空的,因为截断立即发生,而从9i数据库插入的INTO...SELECT需要几分钟才能完成。

所以,我想知道这是否是Oracle在事务中处理截断的方式,还是整个操作被执行和COMMITted,尽管截断不能回滚?或者,换句话说,从外部选择的角度来看,如果我包装一个TRUNCANTE并在事务中的一个表上插入INTO...SELECT,该表是否会显示为空到从表中读取的外部选择?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-22 02:55:22

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

票数 1
EN

Stack Overflow用户

发布于 2016-07-21 18:39:10

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

  1. 插入之前,做分区交换“新的”->旧的和截断“新的”分区。(此时,如果从表中选择旧数据)
  2. 将数据插入“新”分区,截断“旧”分区。(此时您将看到新的数据)。

使用这种方法,您的表永远不会对旁观者来说是空的。

为什么需要3个Oracle环境?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30387581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档