oracle中死锁的解决方法(详解Oracle锁机制--latch)
oracle中死锁的解决方法(详解Oracle锁机制--latch)latch主要是资源的请求和分配,2、保证执行的串行化:1、保证资源的串行访问:– 保护SGA的资源访问– 保护内存的分配
概述前面介绍的是enquence方面的内容,也就是Lock,今天主要介绍一下latch方面。
Latch的定义和作用
Oracle数据库使用闩锁(latch)来管理SGA内存的分配和释放,Latch是用于保护SGA中共享数据结构的一种串行化锁定机制。Latch的实现是与操作系统相关的,尤其和一个进程是否需要等待一个latch、需要等待多长时间有关。
Latch是一种能够极快地被获取和释放的锁,它通常用于保护描述buffer cache中block的数据结构。
比如数据缓存中的某个块要被读取,我们会获得这个块的latch,这个过程叫做pin;另外一个进程恰好要修改这个块,他也要pin这个块,此时他必须等待。当前一个进程释放latch后才能pin住,然后修改。如果多个进程同时请求的话,他们之间将出现竞争,没有一个入队机制,一旦前面进程释放latch,后面的进程就蜂拥而上,没有先来后到的概念,这个和Lock是有本质区别的。这一切都发生的非常快,因为Latch的特点是快而短暂,当然这个只是大致过程。
Latch的目的
1、保证资源的串行访问:
– 保护SGA的资源访问
– 保护内存的分配
2、保证执行的串行化:
Latch在哪里?---SGA
latch主要是资源的请求和分配,
1、共享池
– sql 解析,sql重用....
2、数据缓冲池
– 数据访问,数据写入磁盘,数据读入内存...
– 修改数据块
– 数据段扩展
Oracle有哪些Latch
select name from v$latchname;
Latch的机制
比如数据缓存中的某个块要被读取,我们会获得这个块的 latch,这个过程叫做spin,另外一个进程恰好要修改这个块,他也要spin这个块,此时他必须等待,当前一个进程释放latch后才能spin 住,然后修改,如果多个进程同时请求的话,他们之间将出现竞争,没有一个入队机制, 一旦前面进程释放所定,后面的进程就蜂拥而上,没有先来后到的概念,并且这一切都发生的非常快。
Latch的的获取
1、wait方式--如果无法获取请求的latch,则:
– spin
• 当一个会话无法获得需要的latch时,会继续使用CPU(CPU 空转),达到一个间隔后,
再次尝试申请latch,直到达到最大的重试次数。
– sleep
• 当一个会话无法获得需要的latch时,会等待一段时间(sleep),达到一个间隔后,再次
尝试申请latch 如此反复,直到达到最大的重试次数。
2、No wait方式--如果无法获取请求的latch,则:
– 不会发生sleep或者spin.
– 转而去获取其它可用的Latch
篇幅有限,latch方面的内容就介绍到这了,感兴趣的朋友也可以深入研究下。后面会分享更多devops和DBA方面内容,感兴趣的朋友可以关注下!