防止并行查找 oracle 序列
Prevent parallel lookup to an oracle sequence
我有一些代码可以从 Oracle 数据库中按顺序选择下一个#:
SELECT JOB_SEQ.NEXTVAL FROM DUAL;
问题是这会生成一个 ORA-00900(这没有帮助,因为真正的问题是由于并行性,而不是无效的 SQL 语句)。当两个并行 运行 的脚本(通过分叉方法)尝试 运行 此查询时,会发生此错误。
确保选择不会同时发生的最简单方法是什么?我
我正在使用的堆栈是 PHP / Linux。我已经阅读了有关消息队列的信息,并且希望尽可能避免使用该路由。如果像 Unix 套接字这样的东西可以工作(即,不需要部署额外的软件),那么我更喜欢那样。
所以问题在于分叉的性质以及 Oracle 会话的工作方式。
如果您分叉一个进程,则必须确保子进程中的数据库会话不同。
当您尝试 select 来自同一 Oracle 会话的序列时,OCI 或数据库本身不知道如何处理。
但是,如果会话不同,则没有问题。如果您在 PHP.
中使用 oci8 扩展,这可以简单地通过发出 oci_close() 和 oci_connect() 来完成
编辑:归功于 Justin Cave(上面的评论)解释 selecting 序列在不同的会话中工作。
我有一些代码可以从 Oracle 数据库中按顺序选择下一个#:
SELECT JOB_SEQ.NEXTVAL FROM DUAL;
问题是这会生成一个 ORA-00900(这没有帮助,因为真正的问题是由于并行性,而不是无效的 SQL 语句)。当两个并行 运行 的脚本(通过分叉方法)尝试 运行 此查询时,会发生此错误。
确保选择不会同时发生的最简单方法是什么?我
我正在使用的堆栈是 PHP / Linux。我已经阅读了有关消息队列的信息,并且希望尽可能避免使用该路由。如果像 Unix 套接字这样的东西可以工作(即,不需要部署额外的软件),那么我更喜欢那样。
所以问题在于分叉的性质以及 Oracle 会话的工作方式。
如果您分叉一个进程,则必须确保子进程中的数据库会话不同。
当您尝试 select 来自同一 Oracle 会话的序列时,OCI 或数据库本身不知道如何处理。
但是,如果会话不同,则没有问题。如果您在 PHP.
中使用 oci8 扩展,这可以简单地通过发出 oci_close() 和 oci_connect() 来完成编辑:归功于 Justin Cave(上面的评论)解释 selecting 序列在不同的会话中工作。