Professional Documents
Culture Documents
Jametong@DBA
http://www.dbthink.com/
内容介绍
• Enqueue Lock 基本的概念
• 相关 Enqueue Lock 介绍
– TM 锁 (Table Lock)
– TX 锁 (Transaction Lock)
– HW 锁 (High Watermark Lock)
– US 锁 (Undo Segment Lock)
– TO 锁 (Temporary Object Lock)
– CF 锁 (Control File Lock)
– JO 锁 (Job Queue Lock)
– SQ 锁 (Sequence Cache)
Enqueue Lock 类型
• 数据字典锁 (Data Dictionary Lock)
– 行缓存锁 (Row Cache Lock)
– 库缓存锁 (Library Cache Lock & Library Cache
Pin)
• 数据处理锁 (Data Manipulation Lock)
– 行锁 (Row Lock)
– 表锁 (Table Lock)
• 内部锁以及内部闩锁 (Internal Lock and Latch)
• 分布式锁 (Distributed Lock)
• 并行缓存管理锁 (Parallel Cache Management
(PCM)Lock)
锁资源标识符
Enqueue Resource Identifier
• 每个 Enqueue Lock 都有一个唯一名称 ,
这个名称也被成为锁名称或资源名称
• 标识符的格式为 <type-id1-id2>
– Type 由有两个字母组成 , 如” TM”,”TX”
– Id1 与 id2 为正的数字 (4 个字节长 )
• 下面分别是一个 TX 锁与 TM 锁的例子
– TX-393237-184
– TM-6317-0
Enqueue Lock 模式
模式 内部编号 模式值 描述 ( 以 DML 为例来说明 )
X Yes No No No No No
Enqueue Resource & Enqueue
Lock
• Enqueue 的获取 / 转换 / 释放操作都是由
Session 操作的 ( 而不是 Process)
• 当一个 Session 持有一个 Enqueue 的时候 ,
同时也可能有其它 Session 在请求持有或转
换 Enqueue 模式
• 每个 Enqueue 都有一个资源结构与其对应 ,
由它来管理持有者 (Owners), 等待者
(Waiters) 以及请求转换模式者 (Converter).
• 每个 Owner/waiter/Converter 都有一个对
应的锁结构
Enqueue Resource 结构
Enqueue Hash 与 Latch
• 所有的 Enqueue Resource 都属于一个
Resource 表 (X$ksqrs,v$resource).
• Oracle 使用 hash 来访问数据库中的
Enqueue Resource.
• 每个 Hash bucket 都包含一个资源链表
(Hash Chain)
• 每个 Hash Chain 都有一个或多个 Latch 来控
制访问 .
获取 Enqueue Lock 的步骤
• 计算 hash 值 , 确定所需访问资源所在的链表
• 得到对应的 enqueue hash chains latch
• 定位此资源 , 如果不存在 , 则在空闲资源列表中取
一个放到此处
• 获取 enqueues latch
• 获取一个空闲的 Lock 结构
• 将此 Enqueue Lock 对应的信息填充进去
• 将此 Lock 结构挂到此 Enqueue Resource 结构
上
• 释放 enqueues latch
• 释放 enqueue hash chains latch
获取 Enqueue Lock 的步骤 (2)
释放 Enqueue Lock 的步骤
• 计算 hash 值 , 确定所需访问资源所在的链表
• 得到对应的 enqueue hash chains latch
• 定位此资源
• 获取 enqueues latch
• 将 lock 结构从 Enqueue Resource 结构上取出
• 释放 Enqueues latch
• 通知处在等待 ( 转换 ) 队列上的进程 ( 如果有的话 )
• 如果可能 , 释放此 Enqueue Resource, 并将其放入
空闲资源列表
• 释放 enqueue hash chains latch
死锁的检测 (dead-lock)
Enqueue Lock 转储
• alter session set events 'immediate
trace name enqueues level x‘
– Level 1 转储当前活动资源与锁的概要信息 ,
资源空闲列表以及哈希表
– Level >= 2 加上资源结构 (Resource
Structure) 的转储信息
– Level >= 3 加上锁结构 (Lock Structure)
的转储信息
Enqueue Lock 的事件跟踪
• Alter session set events ‘10704 trace
name context forever,level x’;
• 当打开此等待事件 , 将输出请求 Enqueue 的
操作信息 , 以及请求相关的参数
• X 表示等待事件的级别 , 具体说明如下
– 1-4 打出 ksqlrl,ksqcmi 的基本信息
– 5-9 还打出 ksqlac,ksqlop 等回调信息
– 10+ 还打出每个操作对应的时间信息
相关动态视图介绍
• V$resource ( 来自 x$ksqrs) 所有 enqueue resource 相关信息
• V$enqueue_lock ( 主要来自 x$ksqeq) lock Structure 为其主要
信息 , 此视图同时也将此 lock structure 对应的 session 信息与
enqueue resource 信息关联过来了
• V$resource_limit 查看 enqueue_lock 与 enqueue_resource 的
当前使用情况
• V$enqueue_stat ( 来自 x$ksqst) enqueue 操作的相关统计信息
• V$lock 所有 enqueue lock 相关锁信息
• V$locked_object ( 来在 x$ktcxb,v$transaction 完全来自此视
图 ) 查找当前被锁住的对象 .
相关视图介绍
• Lock 相关的视图信息 , 不会自动创建 , 需要执行
catblock.sql
– Dba_lock 基本锁信息
– Dba_lock_internal 包含内部锁 (library cache pin/lock) 以及 latch
– Dba_dml_locks 仅显示 TM 锁信息 , 不过同时关联此锁对应的
– Dba_ddl_locks 仅显示 library cache lock 锁 , 也即基本对象做 ddl 涉及到的
锁
– Dba_waiters,dba_blockers 显示持有或者被阻塞的锁信息
• 显示锁相关的等待树的脚本
– @?/rdbms/admin/utllockt.sql
– 显示当前持有 / 被阻塞的锁的等待树
TM 锁
• 当对表以及表的分区进行操作时就会持有此表上的
TM 锁 .
• 相关操作包含
– 修改表中的数据
– 调整表上的约束
– 调整表对应的索引
– 分析表上的统计信息或者 validate structure
– 并行 dml 操作