Oracle SQL - 使事务成为原子

one*_*ros 3 oracle plsql stored-procedures

我有一个这样的程序:

create or replace
PROCEDURE NEWJOBIDPROC (JOB_ID OUT NUMBER )
--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
-- PROCEDURE TO RETRIEVE THE JOB ID
--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
IS
BEGIN
  -- select the job_id
    SELECT VALUE+1 INTO JOB_ID FROM JOB_TABLE WHERE ID = 50;
  -- update table JOB_TABLE with the latest job id
    UPDATE JOB_TABLE SET VALUE = JOB_ID WHERE ID = 50;

END;
Run Code Online (Sandbox Code Playgroud)

现在我的问题如下.

让我们说我同时多次调用此过程.在我们的示例中,让我们对同一过程进行两次同时调用.当它们都运行select语句时,它们会收到一些值 - 让它为200.

现在,他们将更新job_table,具有相同的值200 - 这不是我想要的.我不想要重复.

那么,我如何将整个代码标记为原子?我希望select和update能够同时运行并且是线程安全的.我希望将两个语句一起标记为原子.

Ton*_*ews 8

请参阅@derobert提供的链接以获取更多信息,但是对于您的特定示例,您可以执行以下操作:

UPDATE JOB_TABLE SET VALUE = VALUE +1 WHERE ID = 50
 RETURNING VALUE INTO JOB_ID;
Run Code Online (Sandbox Code Playgroud)

但是 - 你有没有考虑使用序列?

  • 序列专门针对此用例而设计. (3认同)