如果我在自动提交模式下将行插入表中,其中一列由序列的nextval值定义,这些值是否保证按插入顺序可见?我想知道是否有来自三个并发连接的场景:
是可能的。
答案 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的查询开始时提交的任何工作。