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. 8.1 Optimization Overview

    8.1 Optimization Overview 8.1 Optimization Overview 8.2 Optimizing SQL Statements 8.3 Optimization a ...

  2. 鼠标键盘无法进入:(EE) config/hal: couldn’t initialise context: (null)

    vi /var/log/Xorg.0.log 发现有一行:(EE) config/hal: couldn’t initialise context: (null) 在xorg.conf里面加上下面选项 ...

  3. CSS flex让所有灵活的项目都带有相同的长度,忽略它们的内容:

    .flexbox {     display: -webkit-box;     display: -webkit-flex;     display: -ms-flexbox;     displa ...

  4. Window的匿名Closing 事件

    group.Closing += (sender, e) => { try {   Code here } } catch (Exception ex) { Exception here } } ...

  5. VS2012/2013编辑器问题

    1. Visual Studio 2013 'Could not evaluate Expression' Debugger Abnormality 解决办法:http://weblog.west-w ...

  6. MyEclipse第一个Servlet程序 --解决Win7系统下MyEclipse与Tomcat连接问题

    前言 本文旨在帮助学习java web开发的人员,熟悉环境,在Win7系统下运行自己的第一个Servlet程序,因为有时候配置不当或系统原因可能会运行不成功,这给初学者带来了一定烦恼,我也是为此烦恼过 ...

  7. JAVA日期处理(Timestamp)

    要写一些与数据库连接时的日期处理,pstmt.setDate()的类型是java.sql.Date类型,这种符合规范的类型其实并没有把时分秒存进数据库,所以存取时就应该用setTimestamp()或 ...

  8. html打开个人QQ聊天页面

    打开qq聊天页面(有权限需要添加好友) <a href="tencent://message/?uin=1578929883&Site=&Menu=yes" ...

  9. iptables 实现centos内网机器访问外网

    环境:一台带外网和内网的机器,另一台只有内网,默认不能上网.两台机器都是centos系统带外网机器的外网ip为 123.221.20.11, 内网ip为 192.168.15.100内网机器的内网ip ...

  10. Sqlserver统计语句

    --查看被缓存的查询计划 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED st.text AS [SQL] , cp.cacheobjtype , c ...