2

我有一个问题,我的印象是解决方案很简单,但我无法弄清楚。

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

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

问题是我有很多线程调用这个过程。有没有一种简单的方法可以一次只让一个线程执行上面的代码?我知道我可以使用select for update,但因为我可以有一个 UPDATE 或 INSERT 我想这对我不起作用。

非常感谢。

4

3 回答 3

1

您想要的最简单的解决方案是在应用程序级别引入某种中间队列 - 各种线程将向队列发送请求,队列处理器将从队列中读取请求并对D B。

在我看来,这将是最简单的解决方案,因为您无需进行太多更改即可使其正常工作。唯一的潜在问题是,如果需要响应,此解决方案可能会很复杂 - 如果是这样,这仍然是一种选择,但由于必须处理异步响应,应用程序代码会有点复杂。

于 2013-04-02T08:21:37.843 回答
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;
于 2013-04-02T12:41:13.963 回答
0

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

ALTER TABLE tl_test 启用表锁;

ALTER TABLE tl_test 禁用表锁定;

于 2013-04-03T11:53:53.857 回答