3

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

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

根据这个博客,它说

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

4

1 回答 1

8

Jonathan Lewis 在他的著作 Oracle Core (pp.222-225) 中对此进行了介绍。我不打算重述所有内容,你应该买这本书(在这里找到)。重要的是,他不仅解释了发生的事情,还向我们展示了如何查看正在发生的事情(通过使用 SQL 跟踪)。

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

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

于 2013-05-05T10:03:10.907 回答