快速业务通道

在JAVA端使Oracle存储过程串行地执行 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15

在JAVA端使Oracle存储过程串行地执行

时间:2011-07-28

我们知道给资源上锁可以使我们串行化地访问资源,oracle为plsql开发人员提供了DBMS_SQL包用来管理USERL LOCK锁资源。这种锁可以使得多个session串行的执行某个存储过程,还可以用来排他的访问某个外部设备或服务,甚至可以检测事务的提交或回滚(提交或回滚时锁的释放)。

有人说我在java端调用db的存储过程,可以使用synchronized lock来串行的调用存储过程。那就不需要db lock呢?因为当java端应用服务器down的时候,存储过程已经在执行了,但是可能oracle session(RAC的db)并没有立即释放掉。当我们重启应用服务器后,其实后台的以前的存储过程还在执行,如果再次调用存储过程,这就无法保证存储过程的串行执行了。所以说存储过程的同步锁是必须放在Oracle db端的。

DBMS_LOCK包具有下面几个API,主要说明以下几个,其他的可以参考oracle相应文档,我们这里只用X锁(排他锁也称写锁)。

PROCEDURE DBMS_LOCK.ALLOCATE_UNIQUE    (lockname IN VARCHAR2    ,lockhandle OUT VARCHAR2    ,expiration_secs IN INTEGER DEFAULT 864000);

参数 描述
lockname 锁的名称
lockhandle 与该名称相对应的锁的唯一标识
expiration_secs 这种名称到锁的映射的保存时间

当多个session用同样的名字lockname来获取唯一标识字符串时,不同的session用同样名字获取的lockhandle是相同的,lockname是最大128位的字符串,而且是大小写敏感的,锁的名字最好不要用"ORAcontentquot;打头,这种锁的名称是被oracle保留的名称。DBMS_LOCK.ALLOCATE_UNIQUE执行完后就会commit所以不能被trigger调用。所有获得的映射都为存放在SYS用户DBMS_LOCK_ALLOCATED视图中。

FUNCTION DBMS_LOCK.REQUEST    (id IN INTEGER    ,lockmode IN INTEGER DEFAULT X_MODE    ,timeout IN INTEGER DEFAULT MAXWAIT    ,release_on_commit IN BOOLEAN DEFAULT FALSE) RETURN INTEGER; FUNCTION DBMS_LOCK.REQUEST    (lockhandle IN VARCHAR2    ,lockmode IN INTEGER DEFAULT X_MODE    ,timeout IN INTEGER DEFAULT MAXWAIT    ,release_on_commit IN BOOLEAN DEFAULT FALSE) RETURN INTEGER;

参数 描述
id 锁的唯一标识
lockhandle 由DBMS_LOCK.ALLOCATE_UNIQUE返回的handle
lockmode 锁的模式
timeout 等待时间
release_on_commit COMMIT or ROLLBACK事务时是否释放锁
返回值 描述
0 成功申请到锁
1 超时
2 死锁
3 参数错误
4 已经拥有特定id或handle的锁
5 不合法的lockhandle

在JAVA端使Oracle存储过程串行地执行(2)

时间:2011-07-28

用户定义的锁标识必须在 0 到 1073741823. 锁标识在范围2000000000 到 2147483647 被oracle公司预先保留。推荐

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号