我遇到了问题,我觉得解决方案很简单,但我无法理解。
A具有多线程env和pl sql存储过程。 在这个过程中,我有类似的东西:
select * into mycount from toto;
If mycount >0 then update...;
else insert ...;
问题是我有许多线程调用此过程。
是否有一种简单的方法一次只有一个线程执行上面的代码?
我知道我可以使用select for update
但是因为我可以进行更新或插入,我想这对我不起作用。
非常感谢。
答案 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;