【发布时间】:2021-11-27 03:26:38
【问题描述】:
我有一个应用程序,用户单击 UI 上的按钮触发 oracle 功能。我想避免在 DB 中多次并行运行该函数(一次应该只有一个正在进行的运行)。我可以使用下面的自定义锁定机制来实现这一点而不必担心死锁吗?
我的方法 -
- 标志最初将设置为 NULL
- 如果多个会话同时触发该功能,那么只有一个会话会继续,因为只有一个会话能够更新标志
- 处理完成后,函数会将标志更新回 NULL
DDL
create table test_oracle_lock (id int, flag varchar(1), primary key (id));
自定义锁定代码以避免并行运行
update test_oracle_lock set flag = 'In Use' where flag is null and id = 1;
updated_rows := sql%rowcount;
commit;
IF updated_rows = 0 then --if unable to update flag (i.e. unable to acquire custom lock) then exit function
EXIT;
ELSE
--execute all sql statements to process data and update flag back to NULL
update test_oracle_lock set flag = NULL where flag = 'In Use' and id = 1;
END IF;
【问题讨论】:
-
一些事情:1.) 如果你打算这样做,请确保你放置一个异常块来重置你的锁,否则如果你的查询之一,你将永远被锁定失败。 2.)检查 dbms_lock,如果功能存在,为什么要构建新的东西。 3.) 任何会话都会在更新行之前锁定,所以这可能是不必要的。
-
dbms_lock 更好,即使你真的想使用自己的表,我更喜欢
select for updatewith wait N ornowaitclausr -
如何使用dbms_lock实现同样的功能?
-
您的意思是 deadlock,具体来说,这是两个会话以这样一种方式将彼此的锁括起来的情况,即两个会话都不能继续或退出,或者只是一个阻塞锁?跨度>
标签: sql database oracle locking database-deadlocks