浅谈Oracle的行级锁

㈠ 单实例Oracle locking机制

locking机制的三大组成部分:

① resource structure

Oracle对于每个需要“并发访问”的资源,都在SGA中用一个数据结构来描述它

这个结构叫resource structure

这个数据结构有三个成员:owner、waiter和converter

这是3个指针

指向由lock structure组成的链表的指针

其中,converter和waiter有些区别:

如果某个操作先后需要两种不同模式的锁,比如,先S,后X,则进程会先请求S,获得后lock structure会挂在owner上,

当需要X时,进行必须先释放S,然后再次申请X

但是可能无法立即获得

这时这个请求会被立即挂在converter下

converter的优先级高于waiter

根据v$lock的lmode和request可以判断他三:

● lmode > 0,request =0 → owner

● lmode = 0,request >0 → waiter

● lmode > 0,request >0 → converter

② lock structure

每当进程要访问共享资源时,必须先锁定该资源

锁定实际就是从SGA中申请一个lock structure

在其中记录lmode 、PID等

然后看能否立刻获得该资源的访问权

● 如果能,则把lock structure挂到resource structure的owner链表中

● 否则,把这个lock structure挂到resource structure的waiter链表中

③ enqueue算法

按先入先出原则分配锁

㈡ 行级锁

以上的locking机制需要resource、lock两种数据结构,适合粗粒度资源,但对于数据记录等细粒度的访问,无论从

内存需求还是维护成本,都是一个恶梦

Oracle的行级锁就是在这种场合下闪亮登场的

行级锁不是Oracle一般意义上的锁

虽然有锁的功能,但是没有锁的开销

行级锁根本没有相关开销,对1千万行锁定所需的资源数与对1行锁定所需的资源数完全相同,这是个常量:0和1

在Oracle的每行数据上,都有一个标志位来表示该行数据是否被锁定,要查看某一行是否被锁定,必须直接找到这一行,

而不要指望能从哪个列表得到答案

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/

我们dump一个数据块,其transaction header的trc文件摘录如下:

Block header dump: 0x01000197

Object id on Block? Y

seg/obj: 0xcd8a csc: 0x00.a26fe itc: 2 flg: E typ: 1 - DATA

brn: 0 bdba: 0x1000191 ver: 0x01 opc: 0

inc: 0 exflg: 0

Itl      Xid         Uba     Flag Lck    Scn/Fsc

0x01  0x0001.005.00000100 0x0080000f.00ae.23 --U-  1 fsc 0x0000.000a2707

0x02  0x0000.000.00000000 0x00000000.0000.00 ----  0 fsc 0x0000.00000000

其中 Lck字段就是行级锁的表示:1加锁,0不加锁

data header的部分trc摘录如下:

tab 0, row 0, @0x1f93

tl: 5 fb: --H-FL-- lb: 0x1 cc: 1

col 0: [ 1] 61

其中 lb => ITL number

其实,lb就是Itl

并发访问时,事务通过这个lb找到Itl,从而确定Lck的值,若为1,则挂到队列池

所以,当用户被阻塞时,不是被某条记录的行级锁阻塞,而是被TX锁阻塞

时间: 2024-12-26 10:50:43

浅谈Oracle的行级锁的相关文章

Oracle行级锁的特殊用法简析_oracle

Oracle有许多的锁,各种锁的效用是不一样的.下面重点介绍Oracle行级锁,Oracle行级锁只对用户正在访问的行进行锁定.可以更好的保证数据的安全性. 如果该用户正在修改某行,那么其他用户就可以更新同一表中该行之外的数据. Oracle行级锁是一种排他锁,防止其他事务修改此行,但是不会阻止读取此行的操作. 在使用INSERT.UPDATE.DELETE 和SELECT-FOR UPDATE 等 语句时,Oracle会自动应用Oracle行级锁行级锁锁定.SELECT...FOR UPDAT

Oracle 数据库针对表主键列并发导致行级锁简单演示_oracle

本文内容 •软件环境 •简单演示 Oracle 数据库并发导致行级锁 本文简单演示针对表主键并发导致的行级锁.并发是两个以上的用户对同样的数据进行修改(包括插入.删除和修改).锁的产生是因为并发.没有并发,就没有锁.并发的产生是因为系统需要,系统需要是因为用户需要. 软件环境 -------------------------------------------------------------------------------- •Windows 2003 Server •Oracle 1

MySQL中的行级锁、表级锁、页级锁_Mysql

在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎).表级锁(MYISAM引擎)和页级锁(BDB引擎 ). 一.行级锁 行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁.行级锁能大大减少数据库操作的冲突.其加锁粒度最小,但加锁的开销也最大.行级锁分为共享锁 和 排他锁. 特点 开销大,加锁慢:会出现死锁:锁定粒度最小,发生锁冲突的概率最低,并发度也

MySQL中的行级锁,表级锁,页级锁

在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在数据库的DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎).表级锁(MYISAM引擎)和页级锁(BDB引擎 ). 行级锁 行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁.行级锁能大大减少数据库操作的冲突.其加锁粒度最小,但加锁的开销也最大.行级锁分为共享锁和排它锁(MySQL中的共享锁与排他锁) 特点 开销大,加锁慢:会出现死锁:锁定粒度最小,

浅谈Oracle数据库外部身份认证研究

以下的文章主要是浅谈Oracle数据库的外部身份认证实际研究,我在一个信誉度很好的网站,找到了一个关于浅谈Oracle数据库外部身份认证的一些实用性很强的相关资料,拿出来供大家分享. 一.服务器上使用操作系统验证 1.配置SQLNET.ORA文件 参数NAMES.DIRECTORY_PATH= (TNSNAMES, ONAMES, HOSTNAME)表明解析客户端连接时所用的主机字符串的方式.TNSNAMES表示采用TNSNAMES.ORA文件来解析:ONAMES表示Oracle使用自己的名称服

浅谈php命令行用法

 这篇文章主要介绍了浅谈php命令行用法的相关资料,需要的朋友可以参考下     Php是一个非常流行的web服务端脚本语言.其实,php不仅仅可以在web服务器中充当重要角色.在命令行一样可以执行. 本文中,笔者为各位介绍下php在命令行中的使用方法. 1. 查看php的版本.配置 在命令行中输入php –v 即可查看当前php的版本. 其他的选项有: –m.-i.笔者在这里就不给出列子了. -m 会显示当前php加载的有效模块. -i 则输出无html格式的phpinfo. 使用 –ini

MySQL行级锁、表级锁、页级锁详细介绍_Mysql

页级:引擎 BDB.表级:引擎 MyISAM , 理解为锁住整个表,可以同时读,写不行行级:引擎 INNODB , 单独的一行记录加锁 表级,直接锁定整张表,在你锁定期间,其它进程无法对该表进行写操作.如果你是写锁,则其它进程则读也不允许行级,,仅对指定的记录进行加锁,这样其它进程还是可以对同一个表中的其它记录进行操作.页级,表级锁速度快,但冲突多,行级冲突少,但速度慢.所以取了折衷的页级,一次锁定相邻的一组记录. MySQL 5.1支持对MyISAM和MEMORY表进行表级锁定,对BDB表进行

Mysql 行级锁的使用及死锁的预防方案_Mysql

一.前言 mysql的InnoDB,支持事务和行级锁,可以使用行锁来处理用户提现等业务.使用mysql锁的时候有时候会出现死锁,要做好死锁的预防. 二.MySQL行级锁 行级锁又分共享锁和排他锁. 共享锁: 名词解释:共享锁又叫做读锁,所有的事务只能对其进行读操作不能写操作,加上共享锁后其他事务不能再加排他锁了只能加行级锁. 用法: SELECT `id` FROM table WHERE id in(1,2) LOCK IN SHARE MODE 结果集的数据都会加共享锁 排他锁: 名词解释:

SqlServer:行级锁问题

问题描述 刚开始研究SQL锁的问题,现在遇到了两个麻烦:一.在写SP时,设置的TimeOut无效,如果事务没有commit的话,即使超过TimeOut的时间,SP还是不能中断.是不是我哪里弄错了?是不是TimeOut不是这样子理解的?能不能给个实际的例子?网上的那些就算了,看了半天,还是不行二.我一旦锁定一行,如:UPDATEBSN_OrderWITH(ROWLOCK)SETDataSt='N'WHEREBSN_OrderSq=@OrderSq;在这行未释放之前,别的页面在访问这张资料表的时候,