Oracle数据库中的锁与闩锁机制详解
立即解锁
发布时间: 2025-08-23 01:22:12 阅读量: 11 订阅数: 30 


Oracle数据库架构与性能优化指南
### Oracle数据库中的锁与闩锁机制详解
在Oracle数据库的多用户环境中,为了确保数据的一致性和并发操作的正确性,锁和闩锁机制起着至关重要的作用。本文将详细介绍TM锁、DDL锁以及闩锁的相关知识,包括它们的作用、类型、使用场景和操作方法。
#### 1. TM (DML Enqueue) Locks
TM锁用于确保在修改表内容时,表的结构不会被更改。例如,当你更新一个表时,会在该表上获取一个TM锁,这将阻止其他用户对该表执行DROP或ALTER命令。如果其他用户在你持有TM锁时尝试对该表执行DDL操作,会收到如下错误信息:
```sql
drop table dept
*
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified
```
你可以通过设置`DDL_LOCK_TIMEOUT`参数让DDL操作等待。具体操作步骤如下:
1. 使用`ALTER SESSION`命令设置`DDL_LOCK_TIMEOUT`的值,例如:
```sql
ALTER SESSION SET DDL_LOCK_TIMEOUT=60;
```
2. 执行DDL操作,如`DROP TABLE`命令。此时,该命令会等待60秒后才返回错误(当然也可能成功)。
TM锁在`V$LOCK`表中的显示示例如下:
```sql
$ sqlplus eoda/foo@PDB1
SQL> create table t1 ( x int );
Table created.
SQL> create table t2 ( x int );
Table created.
SQL> insert into t1 values ( 1 );
1 row created.
SQL> insert into t2 values ( 1 );
1 row created.
SQL> select (select username
from v$session
where sid = v$lock.sid) username,
sid,
id1,
id2,
lmode,
request, block, v$lock.type
from v$lock
where sid = sys_context('userenv','sid');
USERNAME SID ID1 ID2 LMODE REQUEST BLOCK TY
-------- -------- ---------- ---------- ---------- ---------- ---------- --
EODA 22 133 0 4 0 0 AE
EODA 22 244271 0 3 0 0 TM
EODA 22 244270 0 3 0 0 TM
EODA 22 1966095 152 6 0 0 TX
SQL> select object_name, object_id from user_objects where object_id in
(244271,244270);
OBJECT_NAM OBJECT_ID
---------- ----------
T2 244271
T1 244270
```
其中,AE锁是版本锁,从Oracle 11g及以上版本可用,用于保护引用版本不被修改。每个事务只有一个TX锁,但可以有多个TM锁,TM锁的ID1列是DML锁定对象的对象ID,便于查找被锁定的对象。
系统中允许的TM锁总数是可配置的,可通过设置`DML_LOCKS`参数来实现,甚至可以将其设置为零,这并不意味着数据库变为只读,而是不允许执行DDL操作。此外,还可以使用`ALTER TABLE <TABLENAME> DISABLE TABLE LOCK`命令逐个对象地移除获取TM锁的能力,这可以防止误删表,因为在删除表之前需要重新启用表锁。
#### 2. DDL Locks
DDL锁在DDL操作期间自动应用于对象,以防止其他会话对其进行更改。例如,执行`ALTER TABLE T`操
0
0
复制全文
相关推荐










