博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用DBMS_LOCK手动锁定
阅读量:4342 次
发布时间:2019-06-07

本文共 1546 字,大约阅读时间需要 5 分钟。

在PL/SQL中,我们有时候需要保证某个Procedure不被并发执行。一般采用select for update对一个固定数据表的数据行进行锁定。

除此之外,还可以使用dbms_lock包提供的request()和release()方法进行锁定。

 

下面例子的逻辑是,在插入A之前用count()判断,如果A中没有数据就插入。在高并发的环境下,没有锁定就可能造成多条插入。为了避免并发错误,使用dbms_lock进行手动控制。

drop table a; create table a(x int); drop table b; create table b(sid number, dt timestamp default systimestamp); create or replace procedure lock_thing is   l_result int;   l_cnt int; begin -- get the lock with ID=0   -- release_on_commit=false means keep lock until explicitly released or until end-of-session   l_result := dbms_lock.request(id => 0, release_on_commit => false); -------------------------------------------   -- do your own logic here   -------------------------------------------   if l_result = 0 then -- running log     insert into b(sid) values(sys_context('userenv','bg_job_id')); select count(1) into l_cnt from a; if l_cnt = 0 then insert into a(x) values(sys_context('userenv','bg_job_id')); end if; end if; commit; -- explicitly release it   l_result := dbms_lock.release(id => 0); exception when others then     l_result := dbms_lock.release(id => 0); end; /

 用一个程序模拟并发调用procedure,最后的结果是A中仅有一条数据。(NOTE: 这个并发模拟并不严格)

-- use some backgound jobs to simulate concurrent calls declare   l_job int; begin delete a; delete b; commit; for i in 1 .. 100 loop     dbms_job.submit(job => l_job, what => 'begin lock_thing(); end;'); commit; end loop; end; / -- only one row in table A select a.*, b.* from a, b where a.x(+)=b.sid order by b.sid;

转载于:https://www.cnblogs.com/wait4friend/archive/2012/02/10/2345527.html

你可能感兴趣的文章
[Javascript]网页链接加上时间戳防止串用户
查看>>
js面向对象(2)----原型链的继承
查看>>
C#/.net给textbox添加回车事件
查看>>
Java新建Web应用与配置Tomcat流程
查看>>
BZOJ1037 [ZJOI2008]生日聚会Party 【DP】
查看>>
J2EE项目开发中常用到的公共方法
查看>>
linux文件与目录管理(2)
查看>>
兰州商学院正式更名为兰州財经大学
查看>>
python第二十八天,(元类,异常处理,)
查看>>
eclipse下进行c开发,使用zeromq
查看>>
翰思博客
查看>>
阿里云CentOS7搭建SVN服务器
查看>>
(转)每天一个linux命令(15):tail 命令
查看>>
拿不起怎么会放得下呢
查看>>
Python3爬虫(八) 数据存储之TXT、JSON、CSV
查看>>
源码安装caffe2时遇到的问题解决办法
查看>>
Window 相关命令
查看>>
Redis学习-hash数据类型
查看>>
系统进程 zygote(三)—— app_process 的 main 函数
查看>>
【我的学习笔记】汇总
查看>>