ORACLE 锁机制
数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产
生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确
的数据,破坏数据库的一致性。
加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,
先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释
放锁之前,其他的事务不能对此数据对象进行更新操作。
在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即 X 锁)和共享锁(Share
Locks,即 S 锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了
共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两种基本的锁类型来
对数据库的事务进行并发控制。
Oracle 数据库的锁类型
根据保护的对象不同,Oracle 数据库锁可以分为以下几大类:DML 锁(data locks,数据
锁),用于保护数据的完整性;DDL 锁(dictionary locks,字典锁),用于保护数据库对
象的结构,如表、索引等的结构定义;内部锁和闩(internal locks and latches),保护 数
据库的内部结构。
DML 锁的目的在于保证并发情况下的数据完整性,。在 Oracle 数据库中,DML 锁主要包
括 TM 锁和 TX 锁,其中 TM 锁称为表级锁,TX 锁称为事务锁或行级锁。
当 Oracle 执行 DML 语句时,系统自动在所要操作的表上申请 TM 类型的锁。当 TM 锁获得
后,系统再自动申请 TX 类型的锁,并将实际锁定的数据行的锁标志位进行置位。这样在
事务加锁前检查 TX 锁相容性时就不用再逐行检查锁标志,而只需检查 TM 锁模式的相容性
即可,大大提高了系统的效率。TM 锁包括了 SS、SX、S、X 等多种模式,在数据库中用
0-6 来表示。不同的 SQL 操作产生不同类型的 TM 锁。
在数据行上只有 X 锁(排他锁)。在 Oracle 数据库中,当一个事务首次发起一个 DML 语
句时就获得一个 TX 锁,该锁保持到事务被提交或回滚。当两个或多个会话在表的同一条
记录上执行 DML 语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。当
第一个会话提交后,TX 锁被释放,其他会话才可以加锁。
当 Oracle 数据库发生 TX 锁等待时,如果不及时处理常常会引起 Oracle 数据库挂起,或导
致死锁的发生,产生 ORA-60 的错误。这些现象都会对实际应用产生极大的危害,如长时
间未响应,大量事务失败等。
悲观封锁和乐观封锁
一、悲观封锁
锁在用户修改之前就发挥作用:
Select ..for update(nowait)