Oracle如何使用锁模式-阿里云开发者社区

开发者社区> 数据库> 正文
登录阅读全文

Oracle如何使用锁模式

简介:

Oracle锁概述:

Oracle RDBMS的封锁类型可分为如下三类:

1)内部级封锁

内部级封锁是用于保护 ORACLE内部结构,由系统内部实现,用户不能访问,因此我们不必对

此做过多的了解。

2)DDL级封锁(字典/语法分析封锁)DDL级封锁也是由 ORACLE

RDBMS来控制,它用于

保护数据字典和数据定义改变时的一致性和完整性。它是系统在对 SQL定义语句作语法分析时自

动地加锁,无需用户干予。字典/语法分析封锁共分三类:

(1)字典操作锁:用于对字典操作时,锁住数据字典,此封锁是独占的,从而保护任何一个时

刻仅能对一个字典操作。

(2)字典定义锁:用于防止在进行字典操作时又进行语法分析,这样可以避免在查询字典的同

时改动某个表的结构。

(3)表定义锁:用于一个 SQL语句正当访问某个表时,防止字典中与该表有关的项目被修改。

3)DML级封锁

DML级封锁用于控制并发事务中的数据操纵,保证数据的一致性和完整性,其封锁对象可以是表

或行。对用户的数据操纵,Oracle可以自动为操纵的数据进行封锁,但如果有操纵授权,则为满足

并发操纵的需要另外实施封锁。DML封锁可由一个用户进程以显式的方式加锁,也可通过某些

SQL语句隐含方式实现。

 

Oracle锁模式说明:

0none

1null select

2row-s行共享(rs):行级共享锁;其他对象只能查询这些数据行 select for updatelock for

updatelock row share

3row-x行专用(rx):行级排它锁,用于行的修改,在提交前不允许做 dml操作 insertupdate

deletelock row share

4share共享锁(s):阻止其他 dml操作; create indexlock share

5s/row-x共享行专用(srx):共享行级排它锁;阻止其他事务操作, lock share row exclusive

6exclusive专用(x):排它锁;独立访问使用, alter tabledrop abledrop indextruncate table

lock exclusive

 

数字越大锁级别越高,影响的操作越多。

一般的查询语句如 select … from … ;是小于 2的锁,有时会在 v$locked_object

select … from … for update; 2的锁,当对话使用 for update子串打开一个游标时,所有返回集中

的数据行都将处于行级(Row-X)独占式锁定,其他对象只能查询这些数据行,不能进行 updatedelete

 select…for update操作,insert / update / delete … ; 3的锁。

没有 commit之前插入同样的一条记录会没有反应,因为后一个 3的锁会一直等待上一个 3的锁,

必须释放掉上一个才能继续工作;创建索引的时候也会产生 3,4级别的锁。

locked_mode 2,3,4不影响 DML(insert,delete,update,select)操作, DDL(alter,drop)操作

会提示 ora-00054错误,有主外键约束时 update / delete … ;可能会产生 4,5的锁;DDL语句时是 6

的锁。

 DBA角色,查看当前数据库里锁的情况可以用如下 SQL语句:

select object_id,session_id,locked_mode from v$locked_object;

select t2.username,t2.sid,t2.serial#,t2.logon_time

from vlockedobjectt1,vsession t2

where t1.session_id=t2.sid order by t2.logon_time;

如果有长期出现的一列,可能是没有释放的锁,可以用下面 SQL语句杀掉长期没有释放非正常的

锁:

alter system kill session ‘sid,serial#’;

如果出现了锁的问题,某个 DML操作可能等待很久没有反应,出现这种情况不要用 OS系统命

$kill process_num或者 $kill -9 process_num来终止用用户连接等连接操作,因为一个用户进程

可能产生一以上锁, OS进程并不能彻清除锁的问题.记得在数据库级别用

 

alter system kill session ‘sid,serial#’;杀掉不正常的锁。

直接锁表方法

操作语法:

lock table table_name1 [,table_2, ..., table_n] in lock_mode mode nowait

 

操作模式:

lock table table_name in share mode;

lock table table_name in exclusive mode nowait;

lock table table_name in share update mode;

lock table table_name in row exclusive mode nowait;

lock table table_name in share row exclusive mode;

lock table table_name in row share mode nowait;


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
数据库
使用钉钉扫一扫加入圈子
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

其他文章