ORACLE的五种锁

 

Oracle的五种Table   Lock  

 

Oracle中的锁定可以分为几类:DML   lockdata   lock),DDL   lockdictionary   lock)internal   lock/latch

 

DML   lock又可以分为row   locktable   lockrow   lockselect..   for   update/insert/update/delete时隐式自动产生,而table   lock除了隐式产生,也可以调用lock   table   in   name来显示锁定。

 

如果不希望别的session   lock/insert/update/delete表中任意一行,只允许查询,可以用lock   table   table_name   in   exclusive   mode(X)这个锁定模式级别最高,并发度最小。

 

如果允许别的session查询或用select   for   update锁定记录,不允许insert/update/delete,可以用lock   table   table_name   in   share   row   exclusive   mode(SRX)

 

如果允许别的session查询或select   for   update以及lock   table   table_name   in   share   mode,只是不允许insert/update/delete,可以用lock   table   table_name   in   share   mode(share   modeshare   row   exclusive   mode的区别在于一个是非抢占式的而另一个是抢占式的。进入share   row   exclusive   mode后其他session不能阻止你insert/update/delete,而进入share   mode后其他session也同样可以进入share   mode,进而阻止你对表的修改。(S)

 

还有两种锁定模式,row   share(RS)row   exclusive(RX)。他们允许的并发操作更多,一般直接用DML语句自动获得,而不用lock语句。

 

 

ORACLE里锁有以下几种模式:

 

0none

1null  

2Row-S   行共享(RS):共享表锁,sub   share  

3Row-X   行独占(RX):用于行的修改,sub   exclusive  

4Share   共享锁(S):阻止其他DML操作,share

5S/Row-X   共享行独占(SRX):阻止其他事务操作,share/sub   exclusive  

6exclusive   独占(X):独立访问使用,exclusive

 

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

 

1级锁有:Select,有时会在v$locked_object出现。

2级锁有:Select   for   update,Lock   For   Update,Lock   Row   Share  

 

select   for   update当对话使用for   update子串打开一个游标时,所有返回集中的数据行都将处于行级(Row-X)独占式锁定,其他对象只能查询这些数据行,不能进行updatedeleteselect   for   update操作。

 

3级锁有:Insert,   Update,   Delete,   Lock   Row   Exclusive

没有commit之前插入同样的一条记录会没有反应,   因为后一个3的锁会一直等待上一个3的锁,   我们必须释放掉上一个才能继续工作。

 

4级锁有:Create   Index,   Lock   Share

 

locked_mode2,3,4不影响DML(insert,delete,update,select)操作,   DDL(alter,drop)操作会提示ora-00054错误。

00054,   00000,   "resource   busy   and   acquire   with   NOWAIT   specified "

//   *Cause:   Resource   interested   is   busy.

//   *Action:   Retry   if   necessary.

 

5级锁有:Lock   Share   Row   Exclusive  

具体来讲有主外键约束时update   /   delete   ...   ;   可能会产生4,5的锁。

 

6级锁有:Alter   table,   Drop   table,   Drop   Index,   Truncate   table,   Lock   Exclusive

 

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

 

col   owner   for   a12

col   object_name   for   a16

select   b.owner,b.object_name,l.session_id,l.locked_mode

from   v$locked_object   l,   dba_objects   b

where   b.object_id=l.object_id

/

 

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

from   v$locked_object   t1,v$session   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

创建时间:2022-03-30 20:47
浏览量:0