zoukankan      html  css  js  c++  java
  • Buffer lock

    buffer lock


       Oracle 提供非常精确,有效的Row Level Lock机制,多个用户同时修改数据时,为了保护数据。


    以块为单位挂起锁的情况不会发生,但这不太正确。


    以块为单位的锁虽然不存在,但是正因为Oracle I/O以块为单位组成,所以块单位锁是必要的。


    假设Row1,Row2 两个行位于同一个块内,两名用户(用户1,用户2)各自对Row1,Row2执行update,逻辑上两个被更新的行不存在需要互相保护的数据。




    因为Oracle提供Row Level Lock机制,所以修改互相不同的行完全不成问题。但是若两个行位于同一个块内,因物理限制修改块的操作不能同时完成。


    各用户为了修改行,即便以Exclusive模式已获得TX锁,但需要保障当前只有自己在修改块。此时需要获得的锁就称为buffer lock.如果没能获得buffer lock,


    与其他锁相同,需要一直等到获得锁。




     获得Buffer lock的模式有Shared模式和Exclusive模式.读取缓冲区的过程中需要以Shared模式获得锁,修改过程中则需要以Exclusive模式获得锁。


    欲获得Buffer lock的会话之间没有共享性(例如都想Exclusive 或以Shared模式读取过程中,另一个想要以Exclusive模式获得时),就会发生争用。




     Buffer lock 与 cache buffers chains latch,TX锁一起对缓冲区的修改起到了同步化的作用。在抽象的层次上,为了修改一个行,获得latch或锁的过程如下:


    1)为了查找要修改的行相应的块存在的位置(hash chain),请求cache buffer chains latch


    2)对载入块的缓冲区请求Buffer lock,并释放cache buffers chains latch


    3)请求TX锁,修改相应行。若在此过程中,没有获得TX锁,则释放Buffer lock并进入等待状态。之后重复过程1


    4)修改相应(欲修改的)行后,释放buffer lock.


      Buffer lock不是Oracle的正式词汇,也不是一般通用的词汇。
     
      从物理角度确认Buffer lock怎样被使用的方法。就是在转储高速缓冲区并确认后,缓冲区头信息里的user list和waiter list。


    为获得Buffer lock而等待期间内,一般会等待buffer busy waits事件。buffer busy waits等待是最普通的等待现象中的一个,其原因也很多。















  • 相关阅读:
    Ural1387 Vasya's Dad
    SGU481 Hero of Our Time
    sjtu1590 强迫症
    sjtu1591 Count On Tree
    sjtu1585 oil
    sjtu1364 countcountcount
    sjtu1333 函数时代
    Fabric-ca client端初始化过程源码分析
    Fabric-ca server端与client端交互
    Fabric-ca server端初始化过程源码分析
  • 原文地址:https://www.cnblogs.com/zhaoyangjian724/p/3797840.html
Copyright © 2011-2022 走看看