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等待是最普通的等待现象中的一个,其原因也很多。
Buffer lock的更多相关文章
- buffer busy wait
什么是buffer busy wait? A session that reads or modifies a buffer in the SGA must first acquire the cac ...
- 转: 【Java并发编程】之二十:并发新特性—Lock锁和条件变量(含代码)
简单使用Lock锁 Java5中引入了新的锁机制--Java.util.concurrent.locks中的显式的互斥锁:Lock接口,它提供了比synchronized更加广泛的锁定操作.Lock接 ...
- 【Java并发编程】:并发新特性—Lock锁和条件变量
简单使用Lock锁 Java5中引入了新的锁机制——Java.util.concurrent.locks中的显式的互斥锁:Lock接口,它提供了比synchronized更加广泛的锁定操作.Lock接 ...
- buffer cache —— buffer busy waits/read by other session
oracle提供非常精确.有效的row level lock机制,多个用户同时修改数据时,为了保护数据,以块为单位挂起锁的情况不会发生.但这不太正确.以块为单位的锁虽然不存在,但正因为oracle I ...
- buffer cache 深度解析
本文首先详细介绍了oracle中buffer cache的概念以及所包含的内存结构.然后结合各个后台进程(包括DBWRn.CKPT.LGWR等)深入介绍了oracle对于buffer cache的管理 ...
- 【转】Cache Buffer Chain 第三篇
文章转自:http://oracle.chinaitlab.com/induction/862509.html,文章前部分转载,后部分自己加上的. Oracle数据库只读模式的CACHE BUFFER ...
- berkeley db 内存池分配机制
__memp_alloc() 注: MPOOL_ALLOC_SEARCH_DYN 没有 出现在 bdb document上, 也没出现在 除了mp_alloc外的代码里. 先删了 以便代码清楚. 按 ...
- ReentRantLock使用
synchronized原语和ReentrantLock在一般情况下没有什么区别,但是在非常复杂的同步应用中,请考虑使用ReentrantLock,特别是遇到下面2种需求的时候. 1.某个线程在等待一 ...
- 介绍开源的.net通信框架NetworkComms框架 源码分析(十三)ThreadSafeStream
原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架 作者是英国人 以前是收费的 目前作者已经开源 许可是 ...
随机推荐
- bzoj2965
http://www.lydsy.com/JudgeOnline/problem.php?id=2965 http://www.tsinsen.com/A1385 平面图网络流. 首先我们要将平面图转 ...
- cf442C Artem and Array
C. Artem and Array time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- 线性时间构造普吕弗(Prüfer)序列
tree -> sequence 首先预处理数组 deg[N], deg[i]表示编号为i的节点的度数,我们每次要删除的节点肯定是 满足deg[i]=1 的编号最小节点, 首先找到所有叶子并选出 ...
- window.open和window.close的使用详解
有时候,我们想通过JS实现一个<a>的新开标签的效果,此时我们想到了window.open方法实现.那么window.open到底应该怎么使用呢? 我们知道window.open可以新 ...
- 使用gfortran将数据写成Grads格式的代码示例
使用gfortran将数据写成Grads格式的代码示例: !-----'Fortran4Grads.f90' program Fortran4Grads implicit none integer,p ...
- oracle日期计算
查询某月有多少天.代码例如以下: select to_number(add_months( trunc(to_date('2014-11-4 11:13:53','yyyy-mm-dd hh24:mi ...
- [Angular 2] WebStorm - Managing Imports
Some tips for import libaray by using webstorm: // Alt + Enter --> Auto Import // Ctrl + Alt + o ...
- compareTo简介
compareTo()方法是用来比较字符串大小,该方法用来判断一个字符串是大于,等于还是小于另一个字符串.判断字符串大小的依据是根据他们在字典中的顺序决定的 语法 Str1.compareTo(Str ...
- CentOS6.6(单用户模式)重设root密码
1.开机时手要快按任意键,因为默认时间5s 2.grub菜单,只有一个内核,没什么好上下选的,按e键.不过如果你升级了系统或安装了Xen虚拟化后,就会有多个显示了. 3.接下来显示如下,选择第二项,按 ...
- [CSAPP笔记][第二章信息的表示和处理]
信息的表示和处理 2.1 信息存储 机器级程序将存储器视为一个非常大的字节数组,称为虚拟存储器. 存储器的每个字节由一个唯一的数字表示,称为它的地址 所有可能地址的集合称为虚拟地址空间 2.1.1 十 ...