博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
通过dbms_lock了解oracle内部enqueue机制
阅读量:5010 次
发布时间:2019-06-12

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

同时被调用的共享代码如下

create or replace function fun_wxc(p1 in varchar2)return number-- result_cache is  rs number;begin  rs := p1;  sys.dbms_lock.sleep(25);  return rs;end;

锁代码如下

create or replace procedure p_enqueue_test(p_lock_mode/*请求获取的锁模式*/    number,                                           p_lock_expired/*请求等待超时时间*/ number) is  l_name   varchar2(100);  l_handle varchar2(100);  l_is_get number;  f_name   varchar2(240) := 'fun_wxc';--要调用代码片段的名称  p_p1     number := 2;begin  --打印会话信息  dbms_output.put_line('--------------------->session' ||testseq.nextval||'<---------------------');   /*lockname 类似于定义一个资源的名称,用于并发控制程序判断当前这个资源有没有被锁定*/  l_name := f_name || '_' || p_p1;  dbms_lock.allocate_unique(lockname => l_name, lockhandle => l_handle);  dbms_output.put_line('the lock handle is ' || l_handle);  dbms_output.put_line('lock request start time is ' ||                       to_char((sysdate), 'yyyy/mm/dd hh24:mi:ss'));  --锁请求,若果代码已经被执行,锁请求等待xx s后超时退出  l_is_get := dbms_lock.request(l_handle,                                p_lock_mode,                                p_lock_expired,                                false);  --判锁获取是否成功,不成功则不执行我们的代码  if l_is_get <> 0 then    dbms_output.put_line('the procedure is executing,can not call it in the same time');  end if;  if l_is_get = 0 then    dbms_output.put_line('the lock request seccuss,execute start time is ' ||                         to_char((sysdate), 'yyyy/mm/dd hh24:mi:ss'));    -----------------------------------------------------------------    /*要执行的代码开始*/    declare      r1 number;    begin      r1 := fun_wxc(2);    /*要执行的代码结束*/      dbms_output.put_line('the procedure has been executed,finish time is ' ||                           to_char((sysdate), 'yyyy/mm/dd hh24:mi:ss'));    end;    --执行完成后释放锁    l_is_get := dbms_lock.release(l_handle);  end if;end;

同时开5个sqlplus 窗口,模拟5个并发会话要同时执行函数fun_wxc的场景

开始后5个会话依次完成,结果如下

会话1以共享模式获取资源fun_wxc上的锁,成功

会话2以共享模式获取资源fun_wxc上的锁,因为锁模式是兼容的,所以可以成功获取,并且与会话1几乎同时完成,如下时间所示

会话3以排他模式获取资源fun_wxc上的锁,因为锁模式是不兼容的,所以可以被阻塞在等待者队列中,到会话1,2完成后释放资源,最终获取到了锁资源并且成功执行,如下时间所示

会话4以共享模式获取资源fun_wxc上的锁,因为锁模式是不兼容的,所以可以被阻塞在等待者队列中,到会话3完成后释放资源,最终获取到了锁资源并且成功执行,如下时间所示

会话5以排他模式获取资源fun_wxc上的锁,因为锁模式是不兼容的,所以可以被阻塞在等待者队列中,但是等待超时了,所以没有执行如下时间所示

在v$lock 并中也可以监控到执行时候的排队情况,如下

 

转载于:https://www.cnblogs.com/wangxingc/p/6179901.html

你可能感兴趣的文章
7.31实习培训日志-docker sql
查看>>
c#中使用servicestackredis操作redis
查看>>
ios app 真机crash报告分析
查看>>
CRC标准以及简记式
查看>>
SEO搜索引擎
查看>>
关于本地使用tomcat部署web应用,浏览器自动跳转为https的问题
查看>>
一、Text To Speech
查看>>
Java读取并下载网络文件
查看>>
github上构建自己的个人网站
查看>>
在word中粘贴的图片为什么显示不完整
查看>>
SQL Server 数据库的鼠标操作
查看>>
net软件工程师求职简历
查看>>
总线置顶[置顶] Linux bus总线
查看>>
nullnullHandling the Results 处理结果
查看>>
SQL SERVER BOOK
查看>>
JS基础回顾,小练习(判断数组,以及函数)
查看>>
多任务——进程
查看>>
WCF:如何将net.tcp协议寄宿到IIS
查看>>
WebAPI HelpPage支持area
查看>>
Path元素
查看>>