`

如何让并发程序互斥的几种方法

 
阅读更多

 

方法一:在并发程序定义界面将并发程序定义成互斥的,但是该种互斥方法是全局的,也就是说任何情况下该请求同一时间都只能跑一个,这样的话有些业务就不能满足了,比如只要求在同一个OU下不能并发,定义界面如下:



  

 

方法二:使用DBMS_LOCK这个标准包,该方法非常灵活,几乎可以满足所有的业务需求,但是该方法只能在有apps权限的情况下使用,所有如果当权限不足是则不适用了,下面就以同一个OU下不能并发为例,做个小例子:

 

DECLARE
  -- lock
  l_lockname    VARCHAR2(100);
  l_lockhandle  VARCHAR2(200);
  l_lock_output NUMBER;
  l_locked      BOOLEAN := FALSE;
  g_pkg_name    VARCHAR2(240) := 'test_package';
  g_org_id      NUMBER := 125;
BEGIN
  /* 定义按何种方式并发(此处为同一个OU不能同时执行)
  * lockname类似于定义一个唯一的名字,当并发程序执行时就会去判断是否这个唯一标识已经存在*/
  l_lockname := g_pkg_name || '_' || g_org_id;
  --根据l_lockname获取唯一标识l_lockhandle
  dbms_lock.allocate_unique(lockname   => l_lockname,
                            lockhandle => l_lockhandle);
 
  /*用l_lockhandle这个唯一标识去给当前请求加锁
  --  Return value:
  --    0 - success
  --    1 - timeout
  --    2 - deadlock
  --    3 - parameter error
  --    4 - already own lock specified by 'id' or 'lockhandle'
  --    5 - illegal lockhandle*/
  l_lock_output := dbms_lock.request(l_lockhandle,
                                     6,
                                     60,
                                     FALSE);
 
  IF l_lock_output <> 0 THEN
    --Output lock failure message
    RAISE apps.fnd_api.g_exc_error;
  END IF;
 
  --此处添加请求的业务逻辑
  --dbms_lock.sleep(seconds => 50);
 
  /*特别注意的是一定要将lockname释放掉 否则这个并发就永远别想再执行了*/
  IF l_lock_output = 0 THEN
    l_lock_output := dbms_lock.release(l_lockhandle);
  END IF;
EXCEPTION
  WHEN apps.fnd_api.g_exc_error THEN
    IF l_lock_output = 0 THEN
      l_lock_output := dbms_lock.release(l_lockhandle);
    END IF;
  WHEN OTHERS THEN
    IF l_lock_output = 0 THEN
      l_lock_output := dbms_lock.release(l_lockhandle);
    END IF;
END;

 

方法三:在相应业务条件下查询当前是否有正在运行的请求,如果有则退出或等待,该方法一定要根据实际业务情况来判断是否能使用,还是以同一个OU下不能并发为例:

SELECT COUNT(1)
  INTO l_count_request
  FROM apps.fnd_concurrent_programs fcp, 
       apps.fnd_concurrent_requests fcr
 WHERE 1 = 1
   AND fcp.application_id = fcr.program_application_id
   AND fcp.concurrent_program_id = fcr.concurrent_program_id
   AND fcp.concurrent_program_name = 'CUXTEST'
   AND fcr.request_id <> apps.fnd_global.conc_request_id
   AND fcr.argument1 = p_org_id
   AND fcr.phase_code = 'R';
 
IF l_count_request > 0 THEN
  RAISE apps.fnd_api.g_exc_error;
END IF;

 

 

  • 大小: 38.4 KB
1
2
分享到:
评论

相关推荐

    Python多进程并发与多线程并发编程实例总结

    这里对python支持的几种并发方式进行简单的总结。 Python支持的并发分为多线程并发与多进程并发(异步IO本文不涉及)。概念上来说,多进程并发即运行多个独立的程序,优势在于并发处理的任务都由操作系统管理,不足...

    高级开发并发面试题和答案.pdf

    线程有哪几种创建方式; Semaphore+CountDownLatch+CyclicBarrier区别; 描述一下Java线程的生命周期,线程状态; 线程之间的通信方式; 描述一下notify和notifyAll区别; synchronized关键字加在静态方法和实例方法...

    go-advance-concurrency:收集了在Go中应用并发的最佳实践和经验教训

    发生死锁的条件有几种,称为“科夫曼条件”。 互斥:并发进程在任何时候都拥有对资源的专有权等待条件:并发进程必须同时拥有一个资源并正在等待其他资源无抢占:并发进程拥有的资源只能由该进程释放,因此它满足...

    Java并发编程:Synchronized及其实现原理

     Synchronized是Java中解决并发问题的一种常用的方法,也是简单的一种方法。Synchronized的作用主要有三个:(1)确保线程互斥的访问同步代码(2)保证共享变量的修改能够及时可见(3)有效解决重排序问题。从语法...

    Java理论与实践:非阻塞算法简介

    本文介绍了在Java理论与实践中,几种比较简单的非阻塞算法的工作方式。在不只一个线程访问一个互斥的变量时,所有线程都必须使用同步,否则就可能会发生一些非常糟糕的事情。Java语言中主要的同步手段就是...

    操作系统考研指导(北京邮电大学)

    l.5研究操作系统的几种观点 1.6本章基础要点 1.7练习题及参考答案 第2章进程描述与控制 2.l进程的引入 2.1.l前趋图 2.l.2程序的顺序执行 2.1.3程序的并发执行 2.1.4程序并发执行的条件 2.2进程的定义及描述 2.2.1...

    操作系统重点

    分时概念:主要是指若干并发程序对CPU时间的共享。  【了解】  1.操作系统的形成;  2.分时和实时操作系统的特点,见教材16页;  3.操作系统在计算机系统中的地位:是裸机之上的第一层软件,是建立其他所有软件...

    2021操作系统复习.wps

    几种算法:先来先服务,短作业优先,优先级,最高响应比优先,时间片轮转(可能有大题) 17.什么是零头?各种存储管理方式中的零头问题。 18.虚拟存储器的定义和特点。 19.死锁避免。(可能有大题),参考P128...

    计算机操作系统作业二.doc

    一个进程释放一种资源将有可能导致一个或几个进程___D___。 A.由就绪变运行 B.由运行变就绪 C.由阻塞变运行 D.由阻塞变就绪 20.进程控制块PCB不包括的内容就是___D___。 A.CPU现场 B.进程优先级 C.进程运行状态 D....

    深入浅出Linux驱动编程

     (3)Linux设备驱动中广泛涉及到多进程并发的同步、互斥等控制,容易出现bug;  (4)由于属于内核的一部分,Linux设备驱动的调试也相当复杂。 深入浅出Linux设备驱动编程之内核模块  Linux设备驱动属于内核的...

    《计算机操作系统》期末复习指导

    多道程序设计:即在系统内(内存)同时存放并运行几道相互独立的程序。 多道程序设计的基础:是将运行过程进一步细化成几个小的步骤,从而实现宏观上的并行。但从微观上看,内存中的多道程序轮流地或分时地...

    Petri网综合的行为理论.rar

    介绍了发射序列的测试和可达性判定的若干有效算法,研究了并发控制器的综合过程及相关算法,基于Petri网的行为理论,讨论了并发程序的验证与分析方法,介绍了并发验证系统的原理与实现。书中通过大量具有实际背景的...

    loadrunner测试资料

    在测试过程中,可能会出现以下常见的几种测试情况:  一、当事务响应时间的曲线开始由缓慢上升,然后处于平衡,最后慢慢下降这种情形表明:  * 从事务响应时间曲线图持续上升表明系统的处理能力在下降,事务的响应...

    pgo:PGo是源代码,用于将PlusCal编译为Go lang

    例如,是有关互斥问题的PlusCal公式解决方案的资料库。 是Google为构建分布式系统而开发的一种基于C的语言。 它内置了对通道和goroutine并发的支持,这使其非常适合开发分布式系统。 当前没有工具将PlusCal / TLA...

    redisStudy.zip

    加分项:另外redis还对这几种数据结构做了扩展,如GEO对位置计算,hyperLogLog做统计,bitmaps:redis底层存储value值都是存储的二进制数据,redis提供bitmaps(位图)可以直接访问或修改底层存储的二进制数据 ...

    操作系统期末试卷与答案

    有空让进:当无进程在互斥区时,任何有权使用互斥区的进程可进入。 无空等待:不允许两个以上的进程同时进入互斥区。 有限等待:任何进入互斥区的要求应在有限的时间内得到满足。 4、文件目录的作用是什么?一个...

    C#编程经验技巧宝典

    4 &lt;br&gt;0008 为程序设置版本和帮助信息 4 &lt;br&gt;0009 设置Windows应用程序启动窗体 5 &lt;br&gt;0010 设置Web应用程序起始页 5 &lt;br&gt;0011 如何设置程序的出错窗口 5 &lt;br&gt;0012 如何进行程序调试 6 ...

    Linux多线程服务端编程:使用muduo C++网络库

    《Linux多线程服务端编程:使用muduo C++网络库》主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。...

Global site tag (gtag.js) - Google Analytics