Oracle锁概述:
Oracle RDBMS的封锁类型可分为如下三类:
1)内部级封锁
内部级封锁是用于保护 ORACLE内部结构,由系统内部实现,用户不能访问,因此我们不必对
此做过多的了解。
2)DDL级封锁(字典/语法分析封锁)DDL级封锁也是由 ORACLE
RDBMS来控制,它用于
保护数据字典和数据定义改变时的一致性和完整性。它是系统在对 SQL定义语句作语法分析时自
动地加锁,无需用户干予。字典/语法分析封锁共分三类:
(1)字典操作锁:用于对字典操作时,锁住数据字典,此封锁是独占的,从而保护任何一个时
刻仅能对一个字典操作。
(2)字典定义锁:用于防止在进行字典操作时又进行语法分析,这样可以避免在查询字典的同
时改动某个表的结构。
(3)表定义锁:用于一个 SQL语句正当访问某个表时,防止字典中与该表有关的项目被修改。
3)DML级封锁
DML级封锁用于控制并发事务中的数据操纵,保证数据的一致性和完整性,其封锁对象可以是表
或行。对用户的数据操纵,Oracle可以自动为操纵的数据进行封锁,但如果有操纵授权,则为满足
并发操纵的需要另外实施封锁。DML封锁可由一个用户进程以显式的方式加锁,也可通过某些
SQL语句隐含方式实现。
Oracle锁模式说明:
0:none
1:null空 select
2:row-s行共享(rs):行级共享锁;其他对象只能查询这些数据行 select for update、lock for
update、lock row share
3:row-x行专用(rx):行级排它锁,用于行的修改,在提交前不允许做 dml操作 insert、update、
delete、lock row share
4:share共享锁(s):阻止其他 dml操作; create index、lock share
5:s/row-x共享行专用(srx):共享行级排它锁;阻止其他事务操作, lock share row exclusive
6:exclusive专用(x):排它锁;独立访问使用, alter table、drop able、drop index、truncate table、
lock exclusive
数字越大锁级别越高,影响的操作越多。
一般的查询语句如 select … from … ;是小于 2的锁,有时会在 v$locked_object出
select … from … for update;是 2的锁,当对话使用 for update子串打开一个游标时,所有返回集中
的数据行都将处于行级(Row-X)独占式锁定,其他对象只能查询这些数据行,不能进行 update、delete
或 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;