Oracle SQL - 使事务原子化

标签 oracle stored-procedures plsql

我有一个程序是这样的:

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;

现在我的问题如下。

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

现在,他们都将对 job_table 进行更新,其值为 200 - 这不是我想要的。我不想重复。

那么,如何将整个代码标记为原子?我希望选择和更新同时运行并且是线程安全的。我希望将两个语句一起标记为原子。

最佳答案

有关更多信息,请参阅@derobert 提供的链接,但对于您的特定示例,您可以这样做:

UPDATE JOB_TABLE SET VALUE = VALUE +1 WHERE ID = 50
 RETURNING VALUE INTO JOB_ID;

但是 - 你有没有考虑过使用 Sequence 代替?

关于Oracle SQL - 使事务原子化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7903716/

相关文章:

oracle - Oracle中触发器的BEGIN语句后可以声明CURSOR吗?

oracle - 不在 PL/SQL 中传递 OUT 参数

java - 处理日期 java.util、日期 java.sql 和 SimpleDateFormat

mysql - 使用 MySQL 将 LIKE 与存储过程参数连接起来

oracle - 如何在Oracle 11g r2 Express版中更改字符集

sql-server - 删除或不删除存储过程中的临时表

c# - EF 6 代码第一个存储过程 - 只读

sql - SELECT 是否在 PL/SQL 中启动事务

SQL脚本生成SQL脚本

sql - Oracle SQL - 将 select count(*) 转换为零或一