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