首页 > 解决方案 > 在oracle数据库中同时运行相关或相同的程序,互不干扰

问题描述

我有一个用于创建在 oracle 数据库中运行过程的特殊报告的软件,但问题是:当我们创建一个报告时,它使用一些过程并截断并填充一些表,如果我们同时创建另一个报告,它会导致错误,因为它需要用另一个过程截断的我的表信息。所以我正在寻找一种技术或查询来处理这个问题,并在第一个报告完成它在用户没有注意到任何事情的状态下使用的所有过程之后创建第二个报告。在这种情况下,第二个报告的创建时间比第一个报告的时间长。

标签: sqldatabaseoracleoracle11g

解决方案


您可以使用DBMS_LOCK.ALLOCATE_UNIQUE包来同步您的应用程序并强制执行顺序处理。

DECLARE
    l_status number;
    l_lock_handle varchar2(128);
    l_lock_request integer;
BEGIN
    DBMS_LOCK.ALLOCATE_UNIQUE ( lockname =>  'NAME_OF_YOUR_LOCK', lockhandle => l_lock_handle);
    l_status := DBMS_LOCK.REQUEST(lockhandle => l_lock_handle, timeout => 15);
    if (l_status = 0) then
      -- Plase your code here
      -- Only one thread can work here
      l_lock_request  := DBMS_LOCK.release(l_lock_handle);
    else
      -- handle other lock statuses...
    end if;
END;

您可以在此处阅读有关 DBMS_LOCK的更多信息。


推荐阅读