
好的,我们来深入解析 Oracle 19C 数据库中的 V$RESOURCE 动态性能视图。这是一个非常核心的视图,用于理解 Oracle 的锁机制和并发控制。
📖 概述与作用
V$RESOURCE 视图记录了当前数据库实例中所有可被锁定的资源(Enqueue Resources)的信息。Enqueue(队列锁)是 Oracle 用于管理并发访问共享资源(如数据行、表、事务等)的一种高级锁机制。每当一个会话需要以某种模式(如共享、独占)锁定一个资源时,就会在该资源上创建一个 Enqueue。
简单来说,V$RESOURCE 视图回答了 “系统里有哪些东西可以被锁?” 这个问题。它列出了所有已曾被请求或当前正被持有的锁资源(如事务、表、数据块等)的唯一标识。而每个资源上的具体锁请求(会话、模式、等待情况)则记录在 V$LOCK 视图中。
🎯 使用场景
- 高级锁诊断与故障排除:当发生严重的锁等待(enqueue wait)时,例如
enq: TX - row lock contention或enq: TM - contention,DBA 可以通过V$RESOURCE和V$LOCK关联查询,精确定位是哪个特定资源(例如,哪个事务ID、哪个表)导致了阻塞。 - 并发性能分析:监控系统中锁资源的创建数量和类型,可以帮助评估应用的并发特性和锁竞争强度。
- RAC 环境下的全局锁管理:在 Oracle Real Application Clusters (RAC) 环境中,
GV$RESOURCE视图可以显示所有实例中的锁资源信息,对于诊断跨实例的锁争用至关重要。
📊 字段含义详解
下表详细说明了 V$RESOURCE 视图中的各个字段。注意:许多字段包含的是内部地址或转换后的数值,需要与其他视图关联才有实际意义。
| 字段名 | 数据类型 | 含义与说明 |
|---|---|---|
| RESOURCE_NAME | VARCHAR2(30) | 资源名称的前缀(或类型)。这是一个两字符的标识符,代表锁的类型。常见的有: • TX:事务锁(Transaction Lock) • TM:表锁(DML Enqueue / Table Lock) • UL:用户自定义锁(User Lock) • TS:表空间锁(Tablespace Lock) • SQ:序列号锁(Sequence Lock) |
| RESOURCE_ID | RAW(4) | 资源的唯一标识符(ID1)。与 V$LOCK 中的 ID1 字段对应。其含义根据 RESOURCE_NAME 而变化:• 对于 TX 锁: RESOURCE_ID 是事务 ID 的一部分,可转换为回滚段号、槽位号、序列号。• 对于 TM 锁: RESOURCE_ID 就是被锁定的表的 对象ID(OBJECT_ID)。 |
| RESOURCE_TYPE | NUMBER | 资源的内部类型编号。这是一个 Oracle 内部的映射,通常通过 RESOURCE_NAME 来理解类型更为直观。 |
| CURRENT_USERS | NUMBER | 当前以非空模式(即非NULL模式)持有该资源的会话数。NULL 模式表示会话正在等待该资源。这个数字反映了当前真正持有该资源锁的会话数量。 |
| INITIAL_ALLOCATION | VARCHAR2(10) | 资源的初始分配方式。通常是 PERMANENT(永久的),表示该资源结构体是在共享池(Shared Pool)中永久分配的。 |
| LIMIT_VALUE | NUMBER | 该类型资源的最大可分配数量。对于大多数 Enqueue 资源,此值通常为 0,表示没有预定义的限制(仅受 SGA 大小限制)。 |
| OWNER_NODE | NUMBER | (RAC 中重要)拥有该资源的主控节点的标识符。在单实例数据库中,此值为 0。在 RAC 中,它指示哪个实例主要负责管理此资源的锁。 |
| CON_ID | NUMBER | 容器ID。在多租户环境(CDB)中,标识该行数据所属的容器。可能值包括: • 0:表示数据属于整个 CDB。• 1:表示数据属于根容器(CDB$ROOT)。• n (n>1):表示数据属于特定可插拔数据库(PDB)的 ID。 |
🔗 相关视图与基表
-
核心相关视图:
V$LOCK:这是与V$RESOURCE最重要的关联视图。V$RESOURCE描述了 “资源本身”,而V$LOCK描述了 “会话对资源的请求”(即谁以什么模式持有或等待哪个资源)。通过(RESOURCE_NAME, RESOURCE_ID)与V$LOCK的(TYPE, ID1)字段进行关联。V$SESSION:提供持有或等待锁的会话的详细信息(如用户名、机器、程序)。V$ENQUEUE_STAT:显示各类 Enqueue 的统计信息(获取次数、等待次数等)。DBA_OBJECTS:当RESOURCE_NAME为 ‘TM’ 时,通过RESOURCE_ID(即OBJECT_ID) 关联此视图可以查到被锁定的表名。GV$RESOURCE:在 RAC 环境中,显示所有实例的V$RESOURCE信息。
-
关于基表:
V$RESOURCE是一个 **动态性能视图(V视图)∗∗。它的底层数据来源于实例运行时∗∗系统全局区(SGA)中的内存结构∗∗。这些内存结构(哈希桶、链表)用于高效地管理和跟踪所有的Enqueue资源。其底层基表通常是∗∗‘X视图)**。它的底层数据来源于实例运行时**系统全局区(SGA)中的内存结构**。这些内存结构(哈希桶、链表)用于高效地管理和跟踪所有的 Enqueue 资源。 其底层基表通常是 **`X视图)∗∗。它的底层数据来源于实例运行时∗∗系统全局区(SGA)中的内存结构∗∗。这些内存结构(哈希桶、链表)用于高效地管理和跟踪所有的Enqueue资源。其底层基表通常是∗∗‘XKSQRS** 或类似的X‘表。这些‘X` 表。这些 `X‘表。这些‘X表是内存结构的接口,由 Oracle 内核维护,对用户而言是隐藏的、未公开的,并且直接查询它们既复杂也不被支持。V$RESOURCE` 提供了对这些底层数据的安全、友好的访问方式。
⚙️ 底层原理与知识点
1. Enqueue (队列锁) 机制:
Enqueue 是一种复杂的锁结构,用于保护共享资源。它允许并发会话以不同的模式(如 NULL, SS, SX, S, SSX, X)锁定同一资源,并妥善处理它们之间的兼容性。V$RESOURCE 代表了被保护的资源实体。
2. 资源名称(RESOURCE_NAME)的解码:
这是理解锁类型的关键。最常见的两种是:
- TX (Transaction Lock):当一个事务修改数据时,它会在受影响的行上获得一个 TX 锁。
RESOURCE_ID对应的是事务的详细信息。 - TM (DML Enqueue / Table Lock):当执行 DML 语句(INSERT, UPDATE, DELETE)时,为了防止在操作过程中表的结构被更改(如 DDL),会话会在表级别获得一个 TM 锁。
RESOURCE_ID直接就是表的OBJECT_ID。
3. 与 V$LOCK 的关系:
这是最重要的概念。可以将锁系统理解为:
V$RESOURCE:代表被锁的客体(例如,一把锁的锁芯)。V$LOCK:代表锁的主体(例如,谁拿着钥匙插入了锁芯,以及他是想打开它(共享)还是锁上它(独占))。
一个资源(V$RESOURCE中的一行)可以对应多个锁请求(V$LOCK中的多行)。
4. 事务与 TX 锁:
TX 锁的 RESOURCE_ID (即 ID1) 是一个需要解码的数值。可以通过以下查询将其转换为人类可读的事务信息(回滚段号、槽位号、序列号):
SELECT TRUNC (id1 / POWER (2, 16)) AS usn, BITAND (id1, TO_NUMBER ('ffff', 'xxxx')) + 0 AS slot, id2 AS seq FROM v$lock WHERE type = 'TX';
🛠️ 常用查询 SQL
- 查找当前被锁定的表(TM 锁)及相关信息
此查询将V$RESOURCE(TM类型) 与DBA_OBJECTS和V$LOCK关联,找出正在被DML操作锁定的表。
SELECT
r.resource_name,
r.resource_id,
o.owner || '.' || o.object_name AS locked_object,
o.object_type,
l.sid,
s.serial#,
s.username,
s.osuser,
s.machine,
l.lmode,
l.request
FROM
v$resource r
JOIN
v$lock l ON (r.resource_name = l.type AND r.resource_id = l.id1)
JOIN
dba_objects o ON (r.resource_id = o.object_id)
JOIN
v$session s ON (l.sid = s.sid)
WHERE
r.resource_name = 'TM' -- 只查看表锁
AND l.type = 'TM';
- 查看所有类型的活跃锁资源
这是一个概览查询,查看系统中有哪些类型的锁资源被创建了。
SELECT
resource_name,
COUNT(*) AS resource_count,
SUM(current_users) AS total_current_users
FROM
v$resource
GROUP BY
resource_name
ORDER BY
resource_count DESC;
- 诊断特定的 TX 锁等待(阻塞事务)
当发生enq: TX - row lock contention等待时,此查询可以帮助找到阻塞者。
SELECT
'Blocking -> Waiting' AS status,
r.resource_name,
r.resource_id,
l.sid,
s.serial#,
s.username,
s.status AS session_status,
l.lmode,
l.request,
'ALTER SYSTEM KILL SESSION ''' || l.sid || ',' || s.serial# || ''' IMMEDIATE;' AS kill_command
FROM
v$resource r
JOIN
v$lock l ON (r.resource_name = l.type AND r.resource_id = l.id1)
JOIN
v$session s ON (l.sid = s.sid)
WHERE
r.resource_name = 'TX'
AND l.block > 0 -- 查找阻塞其他会话的锁
UNION ALL
SELECT
'Waiting ' AS status, -- Added spaces for alignment in output
r.resource_name,
r.resource_id,
l.sid,
s.serial#,
s.username,
s.status AS session_status,
l.lmode,
l.request,
NULL AS kill_command
FROM
v$resource r
JOIN
v$lock l ON (r.resource_name = l.type AND r.resource_id = l.id1)
JOIN
v$session s ON (l.sid = s.sid)
WHERE
r.resource_name = 'TX'
AND l.request > 0 -- 查找正在请求锁的等待会话
ORDER BY
resource_id, status DESC;
💎 总结
V$RESOURCE 是 Oracle 数据库锁管理体系的核心视图之一,它记录了所有活跃的、可被锁定的资源实体。它的主要价值在于:
- 资源标识:与
V$LOCK结合,为高级锁诊断提供目标对象(哪个表、哪个事务被锁定了)。 - 系统状态洞察:反映了系统的并发活动和潜在的资源竞争热点。
- RAC 全局视角:在集群环境中,对于理解跨实例的锁分布至关重要。
理解 V$RESOURCE 和 V$LOCK 的区别与联系(资源 vs. 请求)是掌握 Oracle 锁机制的关键。在实际故障排查中,它们几乎总是被联合查询。
欢迎关注我的公众号《IT小Chen》
7110

被折叠的 条评论
为什么被折叠?



