latch的层次概念
为什么要有这个层次概念?
大家都知道oracle锁有一个死锁问题,那么latch了?有没有可能两个进程都持有对方正在等待的latch而形成死锁现象?oracle的latch没有这个现象,为什么?就因为有层次的概念,有效的防止latch死锁现象。那么是如何防止的了?那就要说oracle是怎么用这个level的。
关层次oracle有两个规则分别对应不同的latch请求模式:
一个是在愿意等待模式下,一个进程请求的latch的level必须高于这个进程现有持有的latch level。
一个是在不愿意等待模式下,一个进程不能出现持有两个以上同一层次上的latch的情况。
这两个规则的目的就是保证latch被进程请求是按level升序的顺序来操作的。
在实际环境中,no-wait请求模式下不可能有死锁现象。因为进程请求失败后,并不spin and sleep。只是不断偿试。那会不会在不断偿试下,而进入动态死锁了?不会,相反,oracle会使进程释放level比较高的latch,并马上以正确level顺序偿试获取latch。而在willing-to-wait模式下只有以下两种情况。
假设一。
一个进程A持有level为6的latch a,而它在请求latch b level 为6.而另一个进程B持有level为6的latch b,而它在请求latch a level为6.在这种情况下,进程A如果想得到它请求的latch,那么它必须释放现已持有的latch a.进程B也是同样情况,这样就避免了latch deadlock现象。
假设二
一个进程A持有level为6的latch a,而它在请求latch b level 为7.而另一个进程B持有level为7的latch b,而它在请求latch a level为6.这种情况下,进程A是可以请求成功。因为进程B必须释放现有level 为7的latch b。才能请求latch a.B释放了latch后,A进程就可以获得了那个latch。进程B状态则转为请求latch a 的等待中。同样没有了latch deadlock现象.
各个latch层次是从哪儿来的?
chinld latch 是从parent latch继承来的。
parent latch and solitary latch是在oracle内核层次规定的。且这个层次跟oracle各个版本不同而不同.
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7248175/viewspace-918879/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/7248175/viewspace-918879/