ORACLE存储过程,函数加锁

原创 2011年01月25日 10:51:00

 

最近碰到比较头痛的事情,原来单域部署的的应用变成了集群部署,这样java中锁(lock)就失去了效应,因为变成了多实例,于是实现过程采用存储过程来封装业务逻辑,但是之前没有针对于存储过程加锁的经历。

经过翻阅Oracle资料,发现Oralce可以针对存储过程上锁,保证业务逻辑单次通过,已测试验证,特分享下。

在存过的代码里加入下列代码:

 DBMS_LOCK.allocate_unique ('Lock', lockhandle);--针对当前session加锁

   LOOP
      LN := DBMS_LOCK.request (lockhandle, TIMEOUT => 0);

      IF LN NOT IN (0, 4)--判断是否被别session锁住
      THEN
         DBMS_OUTPUT.put_line ('Already run...');
         DBMS_LOCK.sleep (2);--已经被人锁住,休眠2秒
      ELSE
         EXIT;--没有锁,退出轮询
      END IF;
   END LOOP;


--你要锁住的业务逻辑代码


LN := DBMS_LOCK.release (lockhandle);--释放资源


测试方法,启动线程1,在业务逻辑处打断点,锁住存过,启动线程2执行存过,发现已经卡死;继续执行线程1存过指导解锁,发现线程2锁死情况等待2秒后解除,为了达到更好的效果,可以设置休眠时间更长一些

附:  

DBMS_LOCK.request 返回值

0 申请锁定成功

1 申请锁定时超时

2 申请锁定时发生死锁

3 传入参数错误

4 已经获得了锁定,重复申请了锁

5 传入的锁定句柄错误

DBMS_LOCK.release 返回值

0 释放锁定成功

3 传入参数错误

4 并没有获得要释放的锁定

5 传入的锁定句柄错误

ORACLE—009:存储过程加锁

最近碰到一种情况,需要限制某个存储过程只能有一个进程在执行,上一个执行完毕后下一个再执行。也就是类似与程序开发中的线程同步问题。汇总一个下,可以通过如下方法来实现。1、设置一个变量,或者表中的某个字段...
  • yysyangyangyangshan
  • yysyangyangyangshan
  • 2015年01月29日 17:25
  • 2352

使用wrap和unwrap加密解密Oracle的PL/SQL对象(包,存储过程,函数等)代码

使用wrap和unwrap加密解密Oracle的PL/SQL对象(包,存储过程,函数等)代码   Oracle数据库系统自带的PL/SQL对象(包,存储过程,函数等)的代码绝大部分都是使用了wrap程...
  • Samdy_Chan
  • Samdy_Chan
  • 2016年01月31日 20:05
  • 5141

如何检测被锁住的Oracle存储过程

今天遇到了这个情况,然后在网上找了到了这篇文章,借鉴过来做参考吧!  1.查看是哪一个存储过程被锁住 查V$DB_OBJECT_CACHE视图 select * from V$DB_OBJECT...
  • hj402555749
  • hj402555749
  • 2011年08月29日 16:34
  • 5679

使用Oracle Wrap工具加密你的代码

使用Oracle Wrap工具加密你的代码Last Updated: Monday, 2004-11-15 22:31 Eygle        Oracle提供Wrap工具,可以用于加密你的Pack...
  • eygle
  • eygle
  • 2004年11月18日 10:03
  • 1723

oracle sleep函数

SQL> declare v_count number:=0; begin for cc in (select * from test_map where rownum
  • qyongkang
  • qyongkang
  • 2012年09月01日 11:01
  • 3392

使用DBMS_LOCK控制程序并发

在调用并发的程序时,假设两个人同时提交了某一个并发请求,并且传入了同样的参数,假设在程序中使用了对状态的控制,例如在刚进入main函数的时候马上就将状态update了,那么其中某一个人就会查不到该条数...
  • cunxiyuan108
  • cunxiyuan108
  • 2010年11月08日 14:47
  • 4107

给ORACLE的存储过程加密

实现方法:1、  D:/>set NLS_LANG=AMERICAN_AMERICA.USACII7或  D:/>set NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1或...
  • simonllf
  • simonllf
  • 2007年02月12日 16:22
  • 755

使用 Oracle的存储过程实现数据加密和解密

使用Oracle的存储过程对数据进行加密和解密 Java调用存储过程
  • fullStackChenZF
  • fullStackChenZF
  • 2017年04月26日 08:22
  • 1675

同一函数可能加锁可能不加锁使用

当一个函数可能在加锁状态下使用,也可能在不加锁状态下使用时,将函数分割为两个版本:加锁版本,不加锁版本 如下例子: #include #include //#include #include ...
  • liuxuejiang158
  • liuxuejiang158
  • 2013年10月28日 20:25
  • 1363

利用mysql内置函数加锁

利用mysql自带函数GET_LOCK(str,timeout) 设法使用字符串str 给定的名字得到一个锁, 超时为timeout 秒。若成功得到锁,则返回 1,若操作超时则返回0 (例如,由于另...
  • lxxxzzl
  • lxxxzzl
  • 2014年10月08日 13:37
  • 1245
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ORACLE存储过程,函数加锁
举报原因:
原因补充:

(最多只允许输入30个字)