序列如何在oracle中保持并发性

时间:2013-05-05 08:48:24

标签: oracle concurrency sequence

如果多个用户同时访问序列(甚至以毫秒为单位),会发生什么。它是死锁还是Oracle有一些机制?

我的意思是,如果A和B用户同时从nextval请求squence1,那么他们将获得相同的价值,否则他们会被绞死。

根据this blog,它说

  

NextVal对序列的并发访问将始终单独返回   每个调用者的值。 (除非序列已设置为循环   值 - 在这种情况下可以重复值。)

1 个答案:

答案 0 :(得分:8)

乔纳森·刘易斯在他的书“Oracle核心”(第222-225页)中介绍了这一点。我不打算重述一切,你应该买这本书(find it here)。重要的是,他不仅解释了发生了什么,还向我们展示了我们如何看待正在发生的事情(通过使用SQL跟踪)。

基本上,每个序列只是核心表seq$中的一行。第一次调用nextval会发出对该序列条目的更新。这会将序列的高水位标记增加到起始值+缓存值。数据库跟踪SGA中的当前值(起始值+ nextval的调用次数);当该数字达到高水位时,数据库会再次更新seq$

需要注意的重要一点是,所有这些都是在SGA中管理的,而不是单个会话。单个会话跟踪的唯一内容是最近一次调用nextval的结果,因此它可以满足对currval的后续调用。