
V$TRANSACTION 是 Oracle 19C 中一个非常关键的动态性能视图,它揭示了数据库当前正在进行的所有活动事务的信息。对于诊断锁冲突、监控事务状态、分析性能问题至关重要。
📊 深入理解 Oracle 19C 的 V$TRANSACTION 视图
1 视图概述与核心作用
V$TRANSACTION 视图是 Oracle 数据库提供给数据库管理员(DBA)和开发者用于监控和管理活动事务的重要工具。它记录了数据库中每一个尚未提交(COMMIT)或回滚(ROLLBACK)的事务的详细信息。这些信息包括事务使用的回滚段、事务状态、占用的资源等,是分析数据库并发行为和性能问题的关键。
它的核心作用主要体现在:
- 实时事务监控:实时查看系统中哪些事务正在活动,以及它们的状态。
- 故障诊断与恢复:当出现锁等待、阻塞或长时间未提交的事务时,帮助定位问题根源。
- 性能分析:通过分析事务使用的undo块、逻辑I/O等指标,评估事务对系统资源的消耗。
- 空间管理:监控事务对回滚段的使用情况,辅助管理undo表空间。
2 核心字段详解
V$TRANSACTION 包含大量字段,下表列出了最重要的一些字段及其含义。
| 字段名 | 数据类型 | 是否可为空 | 描述 |
|---|---|---|---|
| ADDR | RAW(4 | 8) | NO | 事务状态对象在内存中的地址。唯一标识一个事务对象。 |
| XIDUSN | NUMBER | NO | Undo Segment Number(回滚段号)。事务使用的回滚段的编号。 |
| XIDSLOT | NUMBER | NO | Slot Number(槽号)。事务在回滚段头部的事务表(Transaction Table)中对应的记录编号或槽号。 |
| XIDSQN | NUMBER | NO | Sequence Number(序列号)。事务的序列号或覆盖次数。XIDUSN, XIDSLOT, XIDSQN 三个值组合在一起,唯一地标识了一个事务(常被称为XID或事务ID)。 |
| STATUS | VARCHAR2(16) | NO | 事务的当前状态。常见值:‘ACTIVE’(活动,未提交)、‘COMMITTED’(已提交)、‘ROLLED BACK’(已回滚)。 |
| START_TIME | VARCHAR2(20) | YES | 事务开始的时间( wall clock time)。 |
| START_SCNB | NUMBER | NO | 事务开始的系统变更号(SCN)的基值(System Change Number Base)。 |
| USED_UBLK | NUMBER | NO | 已使用的Undo块数。该事务当前已经占用的Undo数据块的数量。这个值在不断增长,表明事务正在执行大量DML操作或长时间未提交;若其在回滚期间不断减小,则表明事务正在回滚。 |
| USED_UREC | NUMBER | NO | 已使用的Undo记录数。该事务产生的Undo记录的行数。作用同USED_UBLK,但粒度更细。 |
| LOG_IO | NUMBER | NO | 该事务产生的逻辑I/O数量。 |
| PHY_IO | NUMBER | NO | 该事务产生的物理I/O数量。 |
| CR_GET | NUMBER | NO | 该事务产生的一致读(Consistent Gets) 的数量。 |
| CR_CHANGE | NUMBER | NO | 该事务产生的一致更改(Consistent Changes) 的数量。 |
| SES_ADDR | RAW(4 | 8) | NO | 会话对象地址。对应V$SESSION视图的SADDR列。用于关联会话信息。 |
| FLAG | NUMBER | NO | 内部标志位。 |
| SPACE | VARCHAR2(3) | YES | 是否为空间事务(例如涉及段空间管理的事务)。‘YES’ or ‘NO’。 |
| PRV_XID | RAW(8) | YES | 前一个事务的XID(事务ID)。 |
| XID | RAW(8) | YES | 当前事务的完整事务标识符(XID)。 |
::: tip
XIDUSN, XIDSLOT, XIDSQN 是识别一个事务最核心的三个字段。在许多与锁和事务相关的查询中,都需要用到它们。
:::
3 工作原理与底层机制
要深入理解 V$TRANSACTION,需要了解 Oracle 事务处理的基本原理。
3.1 事务的生命周期与 V$TRANSACTION
- 事务开始:当执行第一条 DML 语句(如 INSERT, UPDATE, DELETE)或显式使用
SET TRANSACTION时,一个事务隐式或显式开始。 - 分配回滚段:Oracle 会尝试为事务分配一个可用的回滚段(Undo Segment)。这个过程涉及选择在线且有空闲空间的回滚段,如果找不到,可能会等待
enq: US - contention事件。 - 创建事务槽(Slot):在分配的回滚段头部的事务表(Transaction Table)中,会分配一个事务槽(XIDSLOT),并生成一个唯一的 序列号(XIDSQN)。至此,事务获得了唯一标识 XID (
XIDUSN.XIDSLOT.XIDSQN)。 - 记录V
T
R
A
N
S
A
C
T
I
O
N
∗
∗
:此时,一条记录就会被插入到
∗
∗
V
TRANSACTION**:此时,一条记录就会被插入到 **V
TRANSACTION∗∗:此时,一条记录就会被插入到∗∗VTRANSACTION 视图中,
STATUS为 ‘ACTIVE’。事务对数据的修改会产生 Undo 记录,这些记录存储在回滚段中,USED_UBLK和USED_UREC会随之增加。 - 事务结束:当执行 COMMIT 或 ROLLBACK 时:
- COMMIT:Oracle 会生成一个 SCN 作为提交标记,将重做日志缓冲区内容写入日志文件(Log File),然后释放事务持有的锁。随后,该事务在 V$TRANSACTION 中的记录会立即消失。
- ROLLBACK:Oracle 会利用回滚段中的 Undo 数据来撤销修改。在回滚过程中,你依然能在 V$TRANSACTION 中看到该事务,并且
USED_UBLK会逐渐减少直至归零,随后记录消失。
3.2 与底层基表的关系
**V T R A N S A C T I O N ∗ ∗ 是一个 ∗ ∗ 动态性能视图( D y n a m i c P e r f o r m a n c e V i e w ) ∗ ∗ ,并非基于普通的用户表。它直接 ∗ ∗ 映射到内存中的结构 ∗ ∗ ( X TRANSACTION** 是一个**动态性能视图(Dynamic Performance View)**,并非基于普通的用户表。它直接**映射到内存中的结构**(X TRANSACTION∗∗是一个∗∗动态性能视图(DynamicPerformanceView)∗∗,并非基于普通的用户表。它直接∗∗映射到内存中的结构∗∗(X表),这些结构由数据库实例在运行期间维护。
- 源(基表):V T R A N S A C T I O N ∗ ∗ 的数据最终来源于 ∗ ∗ X TRANSACTION** 的数据最终来源于 **X TRANSACTION∗∗的数据最终来源于∗∗XKTUXE( Kernel Transaction Undo Transaction Entry ) 等底层 X$ 表。这些 X$ 表反映了 SGA 中关于事务和回滚段的实时信息。
- 数据生命周期:由于数据源自内存,V$TRANSACTION 只包含当前实例的活动事务信息。一旦实例关闭,这些信息就会丢失。它反映的是实时状态,而非持久化存储的历史记录。
4 主要应用场景
4.1 排查锁冲突与阻塞
这是 V$TRANSACTION 最常用的场景之一。当一个会话挂起,怀疑是被另一个事务阻塞时,可以快速定位活动事务及其会话信息。
SELECT /*+ RULE */
s.sid,
s.serial#,
s.username,
s.machine,
s.program,
s.status,
s.lockwait,
t.xidusn,
t.xidslot,
t.xidsqn,
t.status,
t.start_time,
t.used_ublk
FROM v$transaction t, v$session s
WHERE t.ses_addr = s.saddr;
4.2 监控长时间运行或未提交的事务
查找那些已经使用了大量 Undo 空间或运行了很久但仍未提交的事务,它们可能是导致 Undo 表空间膨胀或阻塞的元凶。
SELECT s.sid,
s.serial#,
s.username,
s.program,
t.start_time,
t.used_ublk,
t.used_urec,
(t.used_ublk * (SELECT value FROM v$parameter WHERE name = 'db_block_size')) AS undo_used_bytes
FROM v$transaction t
INNER JOIN v$session s ON t.ses_addr = s.saddr
ORDER BY t.used_ublk DESC;
4.3 监控事务回滚进度
如果一个事务正在回滚(例如执行了 ROLLBACK 或被意外终止后 Oracle 自动进行回滚恢复),可以通过观察 USED_UBLK 的变化来估算回滚进度。
-- 多次执行此查询,观察USED_UBLK和USED_UREC是否在减少
SELECT s.sid,
s.serial#,
t.used_ublk,
t.used_urec,
t.start_time,
ROUND(t.used_ublk / init_para.value * 100, 2) AS pct_complete
FROM v$transaction t,
v$session s,
(SELECT value FROM v$parameter WHERE name = 'db_block_size') init_para
WHERE t.ses_addr = s.saddr;
5 相关视图与关联查询
V$TRANSACTION 通常需要与其他视图关联查询才能获得更有价值的信息。
| 视图名称 | 描述 | 常用关联字段 |
|---|---|---|
| V$SESSION | 显示当前的所有会话信息。 | V$TRANSACTION.SES_ADDR = V$SESSION.SADDR |
| V$LOCK | 显示当前持有的锁和正在请求的锁的信息。 | V$SESSION.SID = V$LOCK.SID |
| V S Q L ∗ ∗ / ∗ ∗ V SQL** / **V SQL∗∗/∗∗VSQLAREA | 缓存中的 SQL 语句信息。可以通过会话的 SQL_ADDRESS 和 SQL_HASH_VALUE 关联,查看事务正在执行的SQL。 | V$SESSION.SQL_ADDRESS = V$SQL.ADDRESS AND V$SESSION.SQL_HASH_VALUE = V$SQL.HASH_VALUE |
| DBA_OBJECTS | 对象信息表。与 V$LOCK 视图的 ID1 字段关联,可以查询被锁定的对象。 | V$LOCK.ID1 = DBA_OBJECTS.OBJECT_ID |
| V$ROLLSTAT | 回滚段统计信息。与 V$TRANSACTION 的 XIDUSN 关联,可以查询事务使用的回滚段详细信息。 | V$TRANSACTION.XIDUSN = V$ROLLSTAT.USN |
6 关键知识点
- 事务的原子性与Undo:V$TRANSACTION 中的信息与 Oracle 利用 Undo 段保证事务原子性的机制紧密相关。Undo 段记录了数据修改前的映像,用于回滚和提供一致性读。
- ITL 与块级锁:数据块头部有一个兴趣事务列表(ITL),它记录了所有修改过该块但尚未提交的事务信息(包括 XIDUSN, XIDSLOT, XIDSQN)。这也是行锁实现的基础之一。如果 ITL 槽不足,可能会发生
enq: TX - allocate ITL entry等待。 - 提交与日志写入:提交的首要操作是将重做日志缓冲区中的内容写入磁盘上的重做日志文件(Log File),以确保事务的持久性(Durability)。V$TRANSACTION 的状态更新是在这之后发生的。
希望这份详细的解释能帮助你全面深入地理解 Oracle 19C 中的 V$TRANSACTION 视图。如果你有任何其他问题,请随时提出。
欢迎关注我的公众号《IT小Chen》
459

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



