具有序列号nextvalval的插入是否为此数字的原子?

时间:2017-03-04 21:51:17

标签: oracle sequence

如果我在自动提交模式下将行插入表中,其中一列由序列的nextval值定义,这些值是否保证按插入顺序可见?我想知道是否有来自三个并发连接的场景:

  1. 插入foo
  2. 插入栏
  3. 选择全部,观察序列号为2但不是序列号为1的foo栏。
  4. 是可能的。

2 个答案:

答案 0 :(得分:1)

Oralce序列是线程安全的,并且始终按顺序创建。保证所产生的数字是唯一的。

但是如果其他会话仍然是一个打开的事务,你可能看不到其他会话的插入immediatley。这可能会在您从SELECT中看到的序列中产生临时间隙。

此外,如果一个已调用NEXTVAL的事务被回滚,那么这将导致序列中的永久性间隙。序列不受回滚或提交的影响。增量总是立即和明确的。

请参阅:CREATE SEQUENCE(Oracle帮助中心)

答案 1 :(得分:1)

“自动提交”不是Oracle数据库的概念。也就是说,数据库中没有“自动提交”模式或功能 - 它只在工具(如SQL * Plus)中实现。

工具可以以不同的方式实现“自动提交”,但在大多数情况下,它可能与此类似:

(user's command, e.g., INSERT INTO ...)
<success response from Oracle server>
COMMIT;

在这种情况下,在服务器发出用户命令执行的肯定响应之前,工具不会发出COMMIT。在延迟大于10毫秒的网络环境中,加上Oracle服务器本身的多线程变幻莫测,我会说可能是会话#2的自动COMMIT在服务器上处理的情况在会话#1之前,因此,会话#3可能会观察到“bar”而不是“foo”。

每个会话的COMMIT时间相对于会话#3开始查询的时间是唯一重要的。会话#3将看到会话#1和/或会话#2在会话#3的查询开始时提交的任何工作。