ITPub博客

首页 > 数据库 > Oracle > oracle latch,mutex,enqueue内部结构区别详解

oracle latch,mutex,enqueue内部结构区别详解

原创 Oracle 作者:dingjun123 时间:2026-05-12 23:59:19 0 删除 编辑

oracle latch,mutex,enqueue内部结构区别详解 下面把 Oracle 内核三大并发原语 latch / mutex / enqueue 的“长相”一次画清楚,方便你 30 秒内就能说出谁保护什么、长什么样、在哪排队、怎么挂起。 1. Latch(闩)——“挤地铁”型 保护对象:SGA 中的 公共链表/哈希表(cache buffers chains、shared pool chain、redo allocation 等)。 粒度:单实例级,一条 latch 可护很多对象。 结构: – 仅有 1 个状态字(32/64 bit),0=free,PID=持有者。 – 无队列,等待者挂在 latch wait list(latch holder 的 state object 里简单链表)。 – 获取方式: ‑ willing-to-wait:CPU spin _latch_spin_count 次 → yield → sleep(通常 latch free 等待)。 ‑ no-wait:立刻退,用于内部探测。 持续时间:微秒级,代码路径必须短。 常见等待:latch: cache buffers chains / shared pool / redo copy … 视图:vlatch / vlatch_misses / v$latch_children。 一句话:“无队列、自旋+睡、一条链护一堆对象” [^0^]。 2. Mutex(互斥体)——“一把钥匙开一把锁”型 保护对象:单个内存对象(cursor、library-cache hash bucket、redo strand、部分 buffer handle)。 粒度:对象级;一个 mutex 只护一个对象,冲突面最小。 结构: – 每个对象挂 1 个 mutex 槽(64 bit),低 8 位=模式,高位=持有 SID/引用计数。 – 无全局 hash 表,对象地址就是定位键。 – 获取方式: ‑ 同样 spin → sleep,但 spin 次数远小于 latch; ‑ 支持 “引用计数”共享(Library Cache: mutex X → S → 引用计数)。 持续时间:纳秒–微秒级,比 latch 更短。 常见等待:library cache: mutex X / cursor: pin S / redo allocation mutex … 视图:vmutex_sleep / vmutex_sleep_history。 一句话:“零全局结构、对象自带锁、比 latch 轻” [^2^]。 3. Enqueue(队列锁)——“银行叫号”型 保护对象:业务可见资源——行(TX)、表(TM)、序列(SQ)、空间(ST)、Library-Cache-Lock(CU)… 共 200+ 类型。 粒度:资源级;一个 enqueue 资源由 {type, ID1, ID2} 三元组唯一标识。 结构(KSQ 层): – KSQRS(enqueue resource)→ 挂三个双向链表: Owners(已持有) Waiters(纯等待) Converters(已持低级别,想升级) – 所有 KSQRS 散列到 Enqueue Hash Table(大小由 _enqueue_hash 控制),每条链由 enqueue hash chain latch 保护。 – 请求/释放路径:KSQ 函数 → 拿 latch → 查 hash → 挂到对应队列 → 睡在 enqueue 等待事件上 → 持有者释放时唤醒第一个兼容 waiter。 锁模式:6 级 NULL→X,兼容矩阵严格(见下)。 持续时间:事务级,可长达分钟/小时。 常见等待:enq: TX – row lock contention、enq: TM – contention、enq: SQ – contention … 视图:vlock / venqueue_lock / vlock_type / xksqrs(resource)/ x$ksqeq(lock)。 一句话:“三元组标识、三队列管理、事务时长、集群全局可见” [^4^]。 附:6 级模式兼容矩阵(记忆口诀:读读共享,读写互斥,写写互斥) 请求\持有 N SS SX S SSX X N ✓ ✓ ✓ ✓ ✓ ✓ SS ✓ ✓ ✓ ✓ ✓ ✗ SX ✓ ✓ ✓ ✗ ✗ ✗ S ✓ ✓ ✗ ✓ ✗ ✗ SSX ✓ ✓ ✗ ✗ ✗ ✗ X ✓ ✗ ✗ ✗ ✗ ✗ 速记对比表 维度 Latch Mutex Enqueue 保护范围 一段内存结构(多对象) 单个内存对象 业务资源(行、表、事务…) 结构 1 状态字 + 简单链表 对象内嵌 64bit 槽 KSQRS + Owner/Waiter/Converter 链表 排队方式 无队列,spin/sleep 无队列,spin/sleep 三队列,公平唤醒 持续时间 微秒 纳秒–微秒 事务级(毫秒–小时) 等待事件 latch: xxx library cache: mutex … enq: TY – reason 集群可见 本实例 本实例 全局(GES) 视图 vlatch vmutex_sleep vlock / venqueue_lock 记住三句话,基本不会混: Latch 护链表,挤地铁;Mutex 护单个,自带锁;Enqueue 护资源,银行排队。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/7655508/viewspace-3117671/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-05-07

  • 博文量
    45
  • 访问量
    90562