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等待是最普通的等待现象中的一个,其原因也很多。

Buffer lock的更多相关文章

  1. buffer busy wait

    什么是buffer busy wait? A session that reads or modifies a buffer in the SGA must first acquire the cac ...

  2. 转: 【Java并发编程】之二十:并发新特性—Lock锁和条件变量(含代码)

    简单使用Lock锁 Java5中引入了新的锁机制--Java.util.concurrent.locks中的显式的互斥锁:Lock接口,它提供了比synchronized更加广泛的锁定操作.Lock接 ...

  3. 【Java并发编程】:并发新特性—Lock锁和条件变量

    简单使用Lock锁 Java5中引入了新的锁机制——Java.util.concurrent.locks中的显式的互斥锁:Lock接口,它提供了比synchronized更加广泛的锁定操作.Lock接 ...

  4. buffer cache —— buffer busy waits/read by other session

    oracle提供非常精确.有效的row level lock机制,多个用户同时修改数据时,为了保护数据,以块为单位挂起锁的情况不会发生.但这不太正确.以块为单位的锁虽然不存在,但正因为oracle I ...

  5. buffer cache 深度解析

    本文首先详细介绍了oracle中buffer cache的概念以及所包含的内存结构.然后结合各个后台进程(包括DBWRn.CKPT.LGWR等)深入介绍了oracle对于buffer cache的管理 ...

  6. 【转】Cache Buffer Chain 第三篇

    文章转自:http://oracle.chinaitlab.com/induction/862509.html,文章前部分转载,后部分自己加上的. Oracle数据库只读模式的CACHE BUFFER ...

  7. berkeley db 内存池分配机制

    __memp_alloc() 注: MPOOL_ALLOC_SEARCH_DYN 没有 出现在 bdb document上, 也没出现在 除了mp_alloc外的代码里. 先删了 以便代码清楚. 按 ...

  8. ReentRantLock使用

    synchronized原语和ReentrantLock在一般情况下没有什么区别,但是在非常复杂的同步应用中,请考虑使用ReentrantLock,特别是遇到下面2种需求的时候. 1.某个线程在等待一 ...

  9. 介绍开源的.net通信框架NetworkComms框架 源码分析(十三)ThreadSafeStream

    原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架  作者是英国人  以前是收费的 目前作者已经开源  许可是 ...

随机推荐

  1. linux 版本家族

    1. 简单的说,在桌面系统上,可分为Debian和RedHat两大分支,然后Debian这一分支到现在比较火的是Ubuntu, RedHat比较火的是Fedora.贴一下它们的版本历史:  fedor ...

  2. 百度Clouda的初步探索

    最近一直比较关注百度Clouda,参加了数次百度Clouda团队举办的技术沙龙,也利用了一些时间读了开发文档,下面谈谈我对这个框架的初步理解: 1.  轻应用和Clouda的区别和联系:       ...

  3. [iOS] 创建第一个应用程序项目

    开发环境:MacBook Pro XCode 5.0.1 1. 创建新的空的工程 2. 手动添加Controller 3. 将Controller添加到AppDelegate 4. 编辑.xib 5. ...

  4. 通过BulkLoad的方式快速导入海量数据

    摘要 加载数据到HBase的方式有多种,通过HBase API导入或命令行导入或使用第三方(如sqoop)来导入或使用MR来批量导入(耗费磁盘I/O,容易在导入的过程使节点宕机),但是这些方式不是慢就 ...

  5. hdu2531之BFS

    Catch him Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  6. laravel3中文文档是迈入laravel4的捷径

    http://v3.golaravel.com/docs/ 目录 Laravel概览 更新日志 安装与设置 系统需求 安装 服务器设置 基本设置 环境 友好的链接(URL) 路由 基础 通配符(Wil ...

  7. 找工作笔试面试那些事儿(10)---SQL语句总结

    SQL语句中常用关键词及其解释如下: 1)SELECT 将资料从数据库中的表格内选出,两个关键字:从 (FROM) 数据库中的表格内选出 (SELECT).语法为 SELECT "栏位名&q ...

  8. ARM指令集——数据处理指令

    ARM汇编指令集 ARM汇编文件的组成 指令:编译完成后作为一条指令(机器码)存储在内存单元中,CPU执行时能够完成处理的操作 伪指令:在编译时替换成能被识别的ARM指令 伪操作:知道编译器进行编译, ...

  9. Linux多任务编程——进程

    进程编程常用函数 1--- fork pitd_t fork(void); 创建一个新的子进程,其父进程为调用 fork() 函数的进程: 返回值:成功:子进程返回 0,父进程返回 子进程 PID:失 ...

  10. RMAN常用备份恢复命令汇总

    RMAN命令 1.独立命令  RMAN>shutdown immediate  RMAN>startup  RMAN>backup format 'd:\backup\%d_%s.b ...