Decode360's Blog

业精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

  BlogJava :: 首页 :: 新随笔 :: 联系 ::  :: 管理 ::
  302 随笔 :: 26 文章 :: 82 评论 :: 0 Trackbacks
Oracle中的锁
 
    Oracle中的锁可以分为三类:DDL锁DML锁内部锁
 
    基本上所有的锁都可以由Oracle内部自动创建和释放,但是其中的DDL和DML锁是可以通过命令进行直接或者间接的管理的,只有内部锁是必须有Oracle自动管理。
 
    1、内部锁(Latch)--也叫闩
 
    由Oracle自动管理,以保护内部数据库结构,例如数据文件等。比如Oracle要把用户更新的数据写入缓冲区,这时候Oracle就会在该缓冲区上加上latch,用来防止DBWR把他写出到磁盘,因为如果没有这个Latch,DBWR会把一半新一半老没有用的数据写到磁盘上。
 
    2、DDL锁
 
    在使用Create、Truncate、Alter时自动创建,以确保在执行过程中没有其他事务对资源进行访问。
 
    3、DML锁
 
    DML锁在事务开始时创建,在事务提交或回滚是释放。ROLLBACK SAVEPOINT同
 
 
锁的模式
 
    Oracle中的锁可以分为以下几种模式:共享锁(S)排他锁(X)行级共享锁(RS)行级排他锁(RX)共享行级排他锁(SRX)
 
    其中RS锁是限制最少的锁,而X锁是限制最多的锁。相应的操作自动产生锁的对应关系如下:
    * INSERT、UPDATE、DELETE  --RX锁
    * CREATE  --S锁
    * ALTER  --X锁
 
    1、共享锁(SHARE)
    LOCK TABLE table_name IN SHARE MODE
 
    某事务使用S锁锁定表时,只允许其他事务使用S锁锁定该表,不能修改数据
 
    2、排他锁(EXCLUSIVE)
    LOCK TABLE table_name IN EXCLUSIVE MODE
 
    某事务对表加了X锁之后,不再允许其他事务锁定该表
 
    3、行级共享锁(ROW SHARE)
    LOCK TABLE table_name IN ROW SHARE MODE
 
    对相应行加上RS锁后,仍然允许其他事务加RS锁
 
    4、行级排他锁(ROW EXCLUSIVE)
    LOCK TABLE table_name IN ROW EXCLUSIVE MODE
 
    对相应行加上RX锁后,其他事务不能再对该表加锁
 
    5、共享行级排他锁(SHARE ROW EXCLUSIVE)
    LOCK TABLE table_name IN SHARE ROW EXCLUSIVE MODE
 
    对应行加X锁,但对表加S锁,所以可以让别的事务对其他行加入X锁
 
 
 
    具体的相容性如下表:
    
现有模式
请求锁定
S
RS
RX
SRX
X
S
Y
Y
N
N
N
RS
Y
Y
Y
Y
N
RX
N
Y
Y
N
N
SRX
N
Y
N
N
N
X
N
N
N
N
N
 
 
 
 
锁粒度
 
    锁粒度是指被锁定的数据对象大小。锁粒度越大,能够使用的资源就越少,并发度也越小,系统开销也越小。
 
    数据库中的锁粒度分为4个级别:数据库级表级行级列级注意Oracle不支持列级锁!
 
    如果要在事务中处理大量记录,则应该使用表级锁,如果要处理多个大型表,则应该使用数据库级锁,如果都是少量数据,则使用行级。
 
    1、TX锁
 
    TX锁意即Transaction(事务锁、行级锁),改锁从事务开始被创建,事务提交或回滚后释放。
    TX锁可以锁定事务所涉及到的所有数据行。
 
    事务锁只有X锁一种类型,而且是Oracle支持的最低级别的锁。
 
    2、TM锁
 
    TM锁即表级锁,它包括了所有的5种锁模式。
 
    注意:因为Oracle在行级只提供X锁,所以与RS锁对应的行级锁也是X锁!
 
    3、数据库级锁
 
    禁止任何新会话和新事务。主要是为了在没有任何干扰情况下来完成对数据库的维护。
 
    通常DBA将数据库设置到限制性模式来锁定它,在限制性模式中只允许RESTRICTED SESSION特权的的用户登录,命令如下:
 
    ALTER SYSTEM ENABLE RESTRICTED SESSION;
 
    注:这个操作对于已经在数据库中的SESSION将不起作用。
 
 
    也可以通过将数据库设置到READ ONLY模式下来实现锁定数据库。
 
 
 
 
 
 
 
    列举了一些基础,具体研究参阅《Oracle9i&10g编程艺术》第六章。




-The End-

posted on 2008-10-26 21:35 decode360-3 阅读(169) 评论(0)  编辑  收藏 所属分类: Oracle

只有注册用户登录后才能发表评论。


网站导航: