oracle锁
1.概念
数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。
当数据对象被加上排它锁时,其他的事务不能对它读取和修改;加了共享锁的数据对象可以被其他事务读取,但不能修改。
根据保护对象的不同,Oracle数据库锁可以分为以下几大类:
1) DML lock(data locks,数据锁):用于保护数据的完整性,主要包括TM锁(表级锁)和TX锁(事务锁或行级锁);
2) DDL lock(dictionary locks,字典锁):用于保护数据库对象的结构(例如表、视图、索引的结构定义);
3) Internal locks 和latches(内部锁与闩):保护内部数据库结构;
4) Distributed locks(分布式锁):用于OPS(并行服务器)中;
5) PCM locks(并行高速缓存管理锁):用于OPS(并行服务器)中
我们只关注数据锁
2. TX锁(事务锁或行级锁)
TX的本义是Transaction(事务),当一个事务第一次执行数据更改(Insert、Update、Delete)或使用SELECT… FOR UPDATE语句进行查询时,它即获得一个TX(事务)锁,直至该事务结束(执行COMMIT或ROLLBACK操作)时,该锁才被释放。所以,一个TX锁,可以对应多个被该事务锁定的数据行。当两个或多个会话在表的同一条记录上执行 DML语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。当第一个会话提交后,TX锁被释放,其他会话才可以加锁
在Oracle的每行数据上,都有一个标志位来表示该行数据是否被锁定。数据行上的锁标志一旦被置位,就表明该行数据被加X锁,Oracle在数据行上没有S锁
3. TM锁(表级锁)类型共有5种,分别称为共享锁(S锁)、排它锁(X锁)、行级共享锁(RS锁)、行级排它锁(RX锁)、共享行级排它锁(SRX锁)
当Oracle执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位。这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。TM锁包括了SS、SX、S、X等多种模式,在数据库中用0-6来表示。不同的SQL操作产生不同类型的TM锁。如表1所示。
表1 Oracle的TM锁类型 |
|||
锁模式 |
锁描述 |
解释 |
SQL操作 |
0 |
none |
|
|
1 |
NULL |
空 |
Select |
2 |
SS(Row-S) |
行级共享锁,其他对象只能查询这些数据行 |
Select for update、 Lock table * in row share mode |
3 |
SX(Row-X) |
行级排它锁,在提交前不允许做DML操作 |
Insert、Update、Delete、 Lock table * in row exclusive mode |
4 |
S(Share) |
共享锁 |
Create index、 Lock table * in share mode |
5 |
SSX(S/Row-X) |
共享行级排它锁 |
Lock table * in share row exclusive mode |
6 |
X(Exclusive) |
排它锁 |
Alter table、Drop table、Drop index、Truncate table 、 lock table * in exclusive mode |
锁的兼容性
SS/RS和SX/RX才是我们的重点,总结起来就一句话:
如果事务A已经有了RS锁,事务B的DML基本不受影响(除非它们在操作同一记录)
如果事务A已经有了RX锁,事务B的DML基本不受影响(除非它们在操作同一记录)
参考文章:
1. 数据库锁