Oracle如何针对一个表处理多个并发INSERT


8

我试图更深入地了解Oracle 11g。我的问题很简单:Oracle如何处理试图同时将记录插入单个表的两个会话。

例如,INSERT A在表1的1:00 PM运行。它需要5分钟才能完成。INSERT B在表1上于1:02 PM执行。需要1分钟才能完成。

会发生什么?Oracle将在INSERT A完成之后将INSERT B排队等待执行吗?INSERT B是否将与INSERT A同时运行?

谢谢!


6
没有什么比尝试自己
尝试看更好的了

绝对。但是,我不确定如何创建一个查询,该查询将有意地花费5分钟来完成。
达斯汀

3
插入大量数据?insert into foo(id) select level from dual connect by level<1000000(一次增加零的数量,直到足够慢为止)
杰克说请尝试topanswers.xyz 2012年

Answers:


4

除非相互之间存在唯一或主键约束冲突,否则插入不会相互影响。他们应该是独立的。我相信这个并发问题是Oracle的序列是一个单独的对象(与插入分离的缓存,替代PK生成)的原因之一。

在这方面,他们在会话中看到的未提交表上进行操作。下面的stackoverflow帖子中描述了此行为。

/programming/3194999/dml-by-multiple-users-commit-scenarios-in-oracle


2

看看针对应用程序开发人员的Oracle事务管理(概念)SQL处理(高级应用程序开发人员指南)也许很有用。

您可以通过使用sqlplus打开会话来调查oracle的行为,并通过执行以下命令自动提交

设置自动提交关闭

并执行插入

插入tableA(...)值(...);

使此会话保持打开状态,并从另一个窗口启动sqlplus会话,将autocommit设置为off并发出另一个插入。这两个事务都将处于活动状态,直到您通过提交(或回滚)关闭它们为止。

在大多数情况下,实际上没有必要将autocommit设置为off,因为如果您没有更改,这是sqlplkus的默认设置。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.