cheun 发表于 2018-9-26 08:23:58

Oracle latch闩原理示意图

Function Get_Latch(latch_name,mode)  
{
  If Mode eq ‘immediate’ {
  If Fast_Get(latch_name) {
  return TRUE
  Else {
  return FALSE
  }
  }
  Else {
  If Fast_Get(latch_name)
  Then {
  v$latch.gets++
  return TRUE
  }
  Else {
  v$latch.misses++
  for try = 0 .. large_number
  {
  if Spin_Get(latch_name)
  Then {
  return TRUE
  }
  Else {
  T0 = time
  Sleep(try)
  T1=time
  Register_Event("latch free",T1-T0)
  }
  } -- spin/sleep loop
  }
  }
  
}
  

  
Function Fast_Get(latch_name)
  
{
  If try_to_get_latch(latch_name)
  Then {
  return TRUE
  }
  Else {
  return FALSE
  }
  
}
  

  
Function Spin_Get(latch_name)
  
{
  v$latch.spin_get++
  for i = 1 to _spin_count
  {
  If Fast_Get(latch_name)
  Then {
  return TRUE
  }
  }
  
}
  

  
Function Sleep(try)
  
{
  v$latch.sleeps++
  v$latch.sleep++
  sleeptime =
  decode(try,0,0,1,10,2,20,3,~40,4,~80,...~2000)
  sleep(sleeptime)
  
}


页: [1]
查看完整版本: Oracle latch闩原理示意图