方法一:在并发程序定义界面将并发程序定义成互斥的,但是该种互斥方法是全局的,也就是说任何情况下该请求同一时间都只能跑一个,这样的话有些业务就不能满足了,比如只要求在同一个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;
相关推荐
这里对python支持的几种并发方式进行简单的总结。 Python支持的并发分为多线程并发与多进程并发(异步IO本文不涉及)。概念上来说,多进程并发即运行多个独立的程序,优势在于并发处理的任务都由操作系统管理,不足...
线程有哪几种创建方式; Semaphore+CountDownLatch+CyclicBarrier区别; 描述一下Java线程的生命周期,线程状态; 线程之间的通信方式; 描述一下notify和notifyAll区别; synchronized关键字加在静态方法和实例方法...
发生死锁的条件有几种,称为“科夫曼条件”。 互斥:并发进程在任何时候都拥有对资源的专有权等待条件:并发进程必须同时拥有一个资源并正在等待其他资源无抢占:并发进程拥有的资源只能由该进程释放,因此它满足...
Synchronized是Java中解决并发问题的一种常用的方法,也是简单的一种方法。Synchronized的作用主要有三个:(1)确保线程互斥的访问同步代码(2)保证共享变量的修改能够及时可见(3)有效解决重排序问题。从语法...
本文介绍了在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.操作系统在计算机系统中的地位:是裸机之上的第一层软件,是建立其他所有软件...
几种算法:先来先服务,短作业优先,优先级,最高响应比优先,时间片轮转(可能有大题) 17.什么是零头?各种存储管理方式中的零头问题。 18.虚拟存储器的定义和特点。 19.死锁避免。(可能有大题),参考P128...
一个进程释放一种资源将有可能导致一个或几个进程___D___。 A.由就绪变运行 B.由运行变就绪 C.由阻塞变运行 D.由阻塞变就绪 20.进程控制块PCB不包括的内容就是___D___。 A.CPU现场 B.进程优先级 C.进程运行状态 D....
(3)Linux设备驱动中广泛涉及到多进程并发的同步、互斥等控制,容易出现bug; (4)由于属于内核的一部分,Linux设备驱动的调试也相当复杂。 深入浅出Linux设备驱动编程之内核模块 Linux设备驱动属于内核的...
多道程序设计:即在系统内(内存)同时存放并运行几道相互独立的程序。 多道程序设计的基础:是将运行过程进一步细化成几个小的步骤,从而实现宏观上的并行。但从微观上看,内存中的多道程序轮流地或分时地...
介绍了发射序列的测试和可达性判定的若干有效算法,研究了并发控制器的综合过程及相关算法,基于Petri网的行为理论,讨论了并发程序的验证与分析方法,介绍了并发验证系统的原理与实现。书中通过大量具有实际背景的...
在测试过程中,可能会出现以下常见的几种测试情况: 一、当事务响应时间的曲线开始由缓慢上升,然后处于平衡,最后慢慢下降这种情形表明: * 从事务响应时间曲线图持续上升表明系统的处理能力在下降,事务的响应...
例如,是有关互斥问题的PlusCal公式解决方案的资料库。 是Google为构建分布式系统而开发的一种基于C的语言。 它内置了对通道和goroutine并发的支持,这使其非常适合开发分布式系统。 当前没有工具将PlusCal / TLA...
加分项:另外redis还对这几种数据结构做了扩展,如GEO对位置计算,hyperLogLog做统计,bitmaps:redis底层存储value值都是存储的二进制数据,redis提供bitmaps(位图)可以直接访问或修改底层存储的二进制数据 ...
有空让进:当无进程在互斥区时,任何有权使用互斥区的进程可进入。 无空等待:不允许两个以上的进程同时进入互斥区。 有限等待:任何进入互斥区的要求应在有限的时间内得到满足。 4、文件目录的作用是什么?一个...
4 <br>0008 为程序设置版本和帮助信息 4 <br>0009 设置Windows应用程序启动窗体 5 <br>0010 设置Web应用程序起始页 5 <br>0011 如何设置程序的出错窗口 5 <br>0012 如何进行程序调试 6 ...
《Linux多线程服务端编程:使用muduo C++网络库》主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。...