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-