如果多个用户同时访问序列(甚至以毫秒为单位),会发生什么。它是死锁还是Oracle有一些机制?
我的意思是,如果A和B用户同时从nextval
请求squence1
,那么他们将获得相同的价值,否则他们会被绞死。
根据this blog,它说
NextVal对序列的并发访问将始终单独返回 每个调用者的值。 (除非序列已设置为循环 值 - 在这种情况下可以重复值。)
答案 0 :(得分:8)
乔纳森·刘易斯在他的书“Oracle核心”(第222-225页)中介绍了这一点。我不打算重述一切,你应该买这本书(find it here)。重要的是,他不仅解释了发生了什么,还向我们展示了我们如何看待正在发生的事情(通过使用SQL跟踪)。
基本上,每个序列只是核心表seq$
中的一行。第一次调用nextval
会发出对该序列条目的更新。这会将序列的高水位标记增加到起始值+缓存值。数据库跟踪SGA中的当前值(起始值+ nextval
的调用次数);当该数字达到高水位时,数据库会再次更新seq$
。
需要注意的重要一点是,所有这些都是在SGA中管理的,而不是单个会话。单个会话跟踪的唯一内容是最近一次调用nextval
的结果,因此它可以满足对currval
的后续调用。