Buffer lock

时间:2023-03-08 18:23:07
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等待是最普通的等待现象中的一个,其原因也很多。