oracle select&更新或选择&插入多线程环境

时间:2013-04-02 08:14:42

标签: sql multithreading oracle plsql

我遇到了问题,我觉得解决方案很简单,但我无法理解。

A具有多线程env和pl sql存储过程。 在这个过程中,我有类似的东西:

select * into mycount from toto;
If mycount >0 then update...;
else insert ...;

问题是我有许多线程调用此过程。 是否有一种简单的方法一次只有一个线程执行上面的代码? 我知道我可以使用select for update但是因为我可以进行更新或插入,我想这对我不起作用。

非常感谢。

3 个答案:

答案 0 :(得分:1)

您想要的最简单的解决方案是在应用程序级别引入某种中间队列 - 各种线程会向队列发送请求,队列处理器会从队列中读取请求并进行必要的操作打电话给DB。

在我看来,这将是最简单的解决方案,因为您不必为了让它发挥作用而进行太多改变。唯一可能的问题是,如果需要响应,这个解决方案可能会很复杂 - 如果是这样仍然是一个选项,但是应用程序代码由于必须处理异步响应而变得复杂。

答案 1 :(得分:1)

有一个单独的表MODIFY_CHECKER只有一列FLAG。使用此表&列作为一种方法,只允许一个线程在您的实际表上更新/插入(我想是TOTO)

您可以在现有的PL / SQL过程中添加如下内容 -

IF (select count(1) from modify_checker where flag = 1) > 0 THEN
  -- Another thread is already working, so just raise exception
  RAISE <<exception>>
ELSE
  -- No other thread working on this, so go ahead
  UPDATE modify_checker SET flag = 1;
  COMMIT;
  <<actual code to update or insert actual table>>
  UPDATE modify_checker SET flag = 0;
  COMMIT;
END IF;

答案 2 :(得分:0)

您可以在访问过程时立即锁定,并在退出程序时将其释放。这样一次只能有一个人访问它。

ALTER TABLE tl_test ENABLE TABLE LOCK;

ALTER TABLE tl_test DISABLE TABLE LOCK;