Oracle 数据库维护管理之--dbms_lock
1、查询相关的v$视图,但是提示表或视图不存在解决办法
原因是使用的用户没有相关的查询权限导致
解决办法:
grant select any dictionary to 用户; --这个权限比较大
grant select_catalog_role to 用户; --这个权限是最低的要求,但是可以访问到v$相关视图
收回权限
revoke select_catalog_role from 用户;
结果:


2、其中我们需要登录sys或者system级别的用户才可以进行这方面的授权
sys用户,默认的登录密码是change_on_install as sysdba

3、我们可以使用dbms_lock进行多会话(多机)模式下,共享代码片段访问的控制。
--假设我们要控制访问的共享代码片段
create or replace function fun_wxc(p1 in varchar2
)
return number 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
lock_name varchar2(100):='fun_wxc_2';
lock_handle varchar2(100);
lock_is_get number;
begin
--打印会话信息
dbms_output.put_line('--------------------->session start<---------------------');
--lockname 类似于定义一个资源的名称,用于并发控制程序判断当前这个资源有没有被锁定
--产生锁
dbms_lock.allocate_unique(lockname => lock_name,
lockhandle => lock_handle);
dbms_output.put_line('the lock handle is ' || lock_handle);
dbms_output.put_line('lock request start time is ' ||to_char((sysdate), 'yyyy/mm/dd hh24:mi:ss'));
--请求锁,如果代码已经被执行(即公共代码正在被执行),锁请求等待p_lock_expired秒后超时退出
lock_is_get := dbms_lock.request(lock_handle,
p_lock_mode,
p_lock_expired,
false);
--判锁获取是否成功,不成功则不能执行公共代码块
if lock_is_get <> 0 then
dbms_output.put_line('the procedure is executing,can not call it in the same time');
end if;
--请求锁成功
if lock_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;
lock_is_get := dbms_lock.release(lock_handle);--执行完成后释放锁
end if;
end p_enqueue_test;
同时开5个sqlplus 窗口,模拟5个并发会话(多机)要同时执行函数fun_wxc的场景
开始后5个会话依次完成,结果如下
会话1以共享模式获取资源fun_wxc上的锁,成功

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

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

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

会话5以排他模式获取资源fun_wxc上的锁,因为锁模式与会话4产生的锁是不兼容的,所以可以被阻塞在等待者队列中,但是(经历会话1、2共25s+会话3共25s+会话4共25s=75s等待)等待超时了,所以因超时放弃执行(注意超时信息打印时间),如下时间所示

在v$lock 并中也可以监控到执行时候的排队情况,如下
我们使用的查看锁脚本语句是:select * from v$lock;
可以看到,两个会话同时到达公共代码块的入口前一行代码进行锁的申请,由于我们手动启动是先启动会话1的,会话1取得了锁并且是排他锁,所以会话2处于等待状态,等待锁获取时间为10s,而会话1执行的时间是25s(使用系统睡眠函数进行模拟替代),最终在会话1释放锁之前,会话2因为请求锁超时而自动退出,会话1执行完公共代码块后,释放锁资源。

总结:在多会话的情境下,我们可以使用dbms_lock提供的锁机制控制并发执行。
文章参考:http://www.cnblogs.com/wangxingc/p/6179901.html#undefined
Oracle 数据库维护管理之--dbms_lock的更多相关文章
- Oracle 数据库维护管理之--数据库基本信息表管理与优化参考1
1.查看当前系统中的会话(如果权限不足,请使用sys或者system用户登录): select * from v$session t; 2.查看此会话下正在执行的sql语句:select sql_te ...
- Oracle的学习一:安装与卸载、sql *plus常用命令、Oracle用户管理
1.为什么学习oracle? 性能优越: 小型数据库 中型数据库 大型数据库 acess.foxbase mysql.sql server.informix sybase.oracle.db2 复杂量 ...
- ORACLE数据库维护
ORACLE数据库维护(转)----一篇关于oracle的不错的文章 1. ORACLE数据库启动与关闭 1.1 打开和关闭数据库 (手工)1.1.1 sqlplus连接 1.1.2 打开数据 ...
- Oracle内存管理技术
1.Oracle内存管理技术 2.配置自动内存管理(AMM) 3.监视自动内存管理(AMM) 4.配置自动共享内存管理(ASMM) 5.配置自动PGA内存管理 Reference 1.Oracle内存 ...
- Oracle 用户管理与权限控制
Oracle 用户管理与权限控制 oracle数据库的权限系统分为系统权限与对象权限.系统权限( database system privilege )可以让用户执行特定的命令集.例如,create ...
- Oracle权限管理详解
Oracle权限管理详解 转载--CzmMiao的博客生活 Oracle 权限 权限允许用户访问属于其它用户的对象或执行程序,ORACLE系统提供三种权限:Object 对象级.System 系统级. ...
- Oracle—用户管理的完全恢复(四)
在用户管理的备份(三)中,最后打开数据库时,用了alter database open resetlogs;的命令,这里为什么用resetlogs命令? 一.resetlogs的作用 1.将当前的日志 ...
- Oracle—用户管理的完全恢复(一)
一.分类 可以分为在非归档模式下和归档模式下的完全恢复,完全恢复主要是针对归档模式下的,在非归档模式下很难做到完全恢复,除非是在做恢复时,联机重做日志还没有被重写. 二.非归档的有关性质 1.在非归档 ...
- Oracle—用户管理的备份(一)
用户管理的备份(一) 一.首先要知道数据库中表空间和文件的信息,有几个性能视图,v$datafile,v$tablespace,v$tempfile,v$logfile,v$controlfile,d ...
随机推荐
- python之数据类型1
什么是数据类型及数据类型分类 python中的数据类型 python使用对象模型来存储数据,每一个数据类型都有一个内置的类,每新建一个数据,实际就是在初始化生成一个对象,即所有数据都是对 ...
- 技术管理zz
1.管理者最重要的是规划Roadmap 技术管理者并不能完全脱离技术.最少要把握最新技术的发展,了解团队当前技术现状和不足.用于规划的时间应该不少于50%的工作时间.具体而言,规划又分为业务规划和团队 ...
- 2018.09.24 bzoj1016: [JSOI2008]最小生成树计数(并查集+搜索)
传送门 正解是并查集+矩阵树定理. 但由于数据范围小搜索也可以过. 我们需要知道最小生成树的两个性质: 不同的最小生成树中,每种权值的边出现的个数是确定的 不同的生成树中,某一种权值的边连接完成后,形 ...
- hdu-1116(欧拉回路+并查集)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1116 思路:将字符串的头元素和尾元素视为图的x,y节点,然后合并x,y. 如果这个图不连通,则门不能打 ...
- 42 Can stress be Avoided ? 压力能够回避吗 ?
Can stress be Avoided ? 压力能够回避吗 ? ①In the 1960s, medical researchers Thomas Holmes and Richard Rahe ...
- arduino一些内容
arduino 套件使用说明书V1.0.pdf, 步进电机 DHT11 传感器另外一脚要接A0 /* Web client This sketch connects to a website (htt ...
- gj2 python中一切皆对象
2.1 python中一切皆是对象 动态语言和静态语言的区别,Python的面向对象更彻底 同时动态语言,代码的灵活性高 没有编译(检查)的过程,错误只有在运行起来后才会发现 函数和类也是对象,属于p ...
- Linux服务器部署系列之六—远程管理篇
做为网络管理员,我们不可能总是在机房操作服务器,对于windows服务器,我们可以通过远程终端或netmeeting进行操作.但是对于Linux服务器呢?我们也可以使用远程工具进行操作,常用的远程管理 ...
- verilog基础--altera培训
参数化 Localparam :与prameter一样,但不能被重写. Verilog-2001 格式, module mult_acc #(parameter size = 8 ) (...); 数 ...
- java 泛型的类型擦除和桥方法
oracle原文地址:https://docs.oracle.com/javase/tutorial/java/generics/erasure.html 在Java中,泛型的引入是为了在编译时提供强 ...