关于 Oracle 数据库中的锁机制深入研究
本文通过对 Oracle 数据库锁机制的研究,首先介绍了 Oracle 数据库锁的种类,并
描述了实际应用中遇到的与锁相关的异常情况,特别对经常遇到的由于等待锁而使事务被
挂起的问题进行了定位及解决,并对死锁这一比较严重的现象,提出了相应的解决方法和
具体的分析过程。
数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就
会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不
正确的数据,破坏数据库的一致性。
加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操
作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该
事务释放锁之前,其他的事务不能对此数据对象进行更新操作。
在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即 X 锁)和共享锁
(Share Locks,即 S 锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修
改。加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两 种基本的
锁类型来对数据库的事务进行并发控制。
在实际应用中经常会遇到的与锁相关的异常情况,如由于等待锁事务被挂起、死锁等
现象,如果不能及时地解决,将严重影响应用的正常执行,而目前对于该类问题的解决缺
乏系统化研究和指导,本文在总结实际经验的基础上,提出了相应的解决方法和具体的分
析过程。
Oracle 数据库的锁类型
根据保护的对象不同,Oracle 数据库锁可以分为以下几大类:DML 锁(data
locks,数据锁),用于保护数据的完整性;DDL 锁(dictionary locks,字典锁),用
于保护数据库对象的结构,如表、索引等的结构定义;内部锁和闩(internal locks and
latches),保护数据库的内部结构。
DML 锁的目的在于保证并发情况下的数据完整性,本文主要讨论 DML 锁。在
Oracle 数据库中,DML 锁主要包括 TM 锁和 TX 锁,其中 TM 锁称为表级锁,TX 锁称为
事务锁或行级锁。
当 Oracle 执行 DML 语句时,系统自动在所要操作的表上申请 TM 类型的锁。当 TM
锁获得后,系统再自动申请 TX 类型的锁,并将实际锁定的数据行的锁标志位进行置位。
这样在事务加锁前检查 TX 锁相容性时就不用再逐行检查锁标志,而只 需检查 TM 锁模式
的相容性即可,大大提高了系统的效率。TM 锁包括了 SS、SX、S、X 等多种模式,在数
据库中用 0-6 来表示。不同的 SQL 操作产生不同 类型的 TM 锁。如表 1 所示。
在数据行上只有 X 锁(排他锁)。在 Oracle 数据库中,当一个事务首次发起一个
DML 语句时就获得一个 TX 锁,该锁保持到事务被提交或回滚。当两个或多个会话在表的