Oracle为了使数据库实现高度的并发访问,它使用了不同类型的锁来管理并发会话对数据对象的操作。Oracle的锁按作用对象不同分为如下几种类型。
①DML锁:该类型的锁被称为数据锁,用于保护数据。
②DDL锁:可以保护模式中对象的结构。
③内部闩锁:保护数据库的内部结构,完全自动调用。
其中,DML锁主要保证了并发访问时数据的完整性。如果再细分,它又可以分为如下两种类型的锁:
•行级锁(TX),也可以称为事务锁。当修改表中某行记录时,需要对将要修改的记录加行级锁,防止两个事务同时修改相同记录,事务结束,该锁也会释放,是粒度最细的锁。该锁只能属于排他锁(X锁)。
•表级锁(TM),主要作用是防止在修改表的数据时,表的结构发生变化。例如,会话S在修改表A的数据时它会得到表A的TM锁,而此时将不允许其他会话对该表进行变更或删除操作。该情况的验证过程如下:
首先,打开SQL∗Plus,修改表DEPARTMENTS的记录。脚本如下:
此时已经锁定该表,表级锁将不允许在事务结束前其他会话对表DEPARTMENTS进行DDL操作。
其次,打开另一个SQL∗Plus窗口,对该表执行DDL操作。脚本如下:
执行后会提示ORA⁃00054错误,效果如图13.6所示。
图13.6 删除被锁定的表时的提示
在执行DML操作时,数据库会先申请数据对象上的共享锁,防止其他的会话对该对象执行DDL操作。一旦申请成功,则会对将要修改的记录申请排他锁,如果此时其他会话正在修改该记录,那么待其事务结束后再为修改的记录加上排他锁。
表级锁包含如下几种模式:
①ROW SHARE,行级共享锁(RS)。该模式下不允许其他的并行会话对同一张表使用排他锁,但允许其利用DML语句或Lock命令锁定同一张表中的其他记录。SELECT...FROM FOR UPDATE语句就是给记录加上RS锁。
②ROW EXCLUSIVE,行级排他锁(RX)。该模式下允许并行会话对同一张表的其他数据进行修改,但不允许并行会话对同一张表使用排他锁。
③SHARE,共享锁(S)。该模式下,不允许会话更新表,但允许对表添加RS锁。
④SHARE ROW EXCLUSIVE,共享行级排他锁(SRX)。该模式下,不能对同一张表进行DML操作,也不能添加S锁。
⑤EXCLUSIVE,排他锁(X)。该模式下,其他的并行会话不能对表进行DML和DDL操作,该表只能读。
表13.1列出了以上5种模式相互之间的兼容关系。其中,“√”表示相互兼容,“×”表示相互不兼容。
表13.1 TM 5种模式的相互兼容性
表13.2所示为Oracle中的各种SQL语句所产生的表级锁模式以及允许的锁定模式情况的汇总。(www.daowen.com)
表13.2 SQL语句所产生的表级锁情况
在Oracle中除了执行DML时自动为表添加TM锁外,也可以主动地为表添加TM锁。语法如下:
LOCK TABLE[schema.]table IN
[EXCLUSIVE]
[SHARE]
[ROW EXCLUSIVE]
[SHARE ROW EXCLUSIVE]
[ROW SHARE∗ | SHARE UPDATE∗]
MODE[NOWAIT]
如果要释放它们,只需要使用ROLLBACK命令。
DDL锁也可以称为数据字典锁,主要作用是保护模式中对象的结构。当执行DDL操作时,首先Oracle会自动地隐式提交一次事务,然后自动地给处理对象加上锁,当DDL结束时,Oracle会隐式地提交事务并释放DDL锁。与DML不同的是,用户不能是显式地要求使用DDL锁。
DDL锁分为如下3类:
①Exclusive DDL Lock,排他DDL锁定。如果对象加上了该类型的锁,那么对象不能被其他会话修改,而且该对象也不能再增加其他类型的DDL锁。如果是表,此时可以读取数据。
②Share DDL Lock,共享DDL锁定。保护对象的结构,其他会话不能修改该对象的结构,但是允许修改数据。
③Breakable Parsed Lock,能打破的解析锁定。该类型的锁可以被打断,不能禁止DDL操作。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。