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