`
liwenshui322
  • 浏览: 511866 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

oracle DML锁介绍

阅读更多

      DML锁(DML Lock)用于确保一次只有一个人能修改某一行,而且你正在处理一个表时别人不能删除这个表。在你工作时,Oracle会透明程度不一地为你加这些锁。

      首先说第一种DML锁,事务锁。 事务发起第一个修改时会得到TX锁(事务锁),而且会一直持有这个锁,直至事务执行提交(COMMIT)或回滚(ROLLBACK)。

      TX锁用作一种排队机制,使得其他会话可以等待这个事务执行。事务中修改或通过SELECT FOR UPDATE选择的每一行都会“指向”该事务的一个相关TX锁。听上去好像开销很大,但实际上并非如此。要想知道这是为什么,需要从概念上对锁“居住”在哪里以及如何管理锁有所认识。在Oracle中,闩为数据的一个属性(第10章会给出Oracle块格式的一个概述)。Oracle并 没有一个传统的锁管理器,不会用锁管理器为系统中锁定的每一行维护一个长长的列表。不过,其他的许多数据库却是这样做的,因为对于这些数据库来说,锁是一 种稀有资源,需要对锁的使用进行监视。使用的锁越多,系统要管理的方面就越多,所以在这些系统中,如果使用了“太多的”锁就会有问题。

      oracle中的锁定过程如下:

      (1) 找到想锁定的那一行的地址。

      (2) 到达那一行。

      (3) 锁定这一行(如果这一行已经锁定,则等待锁住它的事务结束,除非使用了NOWAIT选项)。

      由于闩为数据的一个属性,Oracle不需要传统的锁管理器。事务只是找到数据[5],如果数据还没有被锁定,则对其锁定。有意思的是,找到数据时,它可能看上去被锁住了,但实际上并非如此。在Oracle中对数据行锁定时,行指向事务ID的一个副本,事务ID存储在包含数据的块中,释放锁时,事务ID却会保留下来。这个事务ID是事务所独有的,表示了回滚段号、槽和序列号。事务ID留在包含数据行的块上,可以告诉其他会话:你“拥有”这个数据(并非块上的所有数据都是你的,只是你修改的那一行“归你所有”)。另一个会话到来时,它会看到锁ID,由于锁ID表示一个事务,所以可以很快地查看持有这个锁的事务是否还是活动的。如果锁不活动,则允许会话访问这个数据。如果锁还是活动的,会话就会要求一旦释放锁就得到通知。因此,这就有了一个排队机制:请求锁的会话会排队,等待目前拥有锁的事务执行,然后得到数据。

      以下是一个小例子,展示了这到底是怎么回事,这里使用了3个V$ 表:

      1. V$TRANSACTION,对应每个活动事务都包含一个条目。

      2. V$SESSION,显示已经登录的会话。

      3. V$LOCK,对应持有所有enqueue队列锁以及正在等待锁的会话,都分别包含一个条目。这并不是说,对于表中被会话锁定的每一行,这个视图中就有相应的一行。你不会看到这种情况。如前所述,不存在行级锁的一个主列表。如果某个会话将EMP表中的一行锁定,V$LOCK视图中就有对应这个会话的一行来指示这一事实。如果一个会话锁定了EMP表中的数百万行,V$LOCK视图中对应这个会话还是只有一行。这个视图显示了各个会话有哪些队列锁。

      首先启动一个事务(如果你没有DEPT表的一个副本,只需使用CREATE TABLE AS SELECT来建立一个副本):

 ops$tkyte@ORA10G update dept set deptno = deptno+10;

4 rows updated.

下面来看看此时系统的状态。这个例子假设是一个单用户系统;否则,在V$TRANS ACTION中可以看到多行。即使在一个单用户的系统中,如果看到V$TRANSACTION中有多行也不要奇怪,因为许多后台Oracle进程可能也会执行事务。

ops$tkyte@ORA10G> select username,

2 v$lock.sid,

3 trunc(id1/power(2,16)) rbs,

4 bitand(id1,to_number('ffff','xxxx'))+0 slot,

5 id2 seq,

6 lmode,

 7 request

8 from v$lock, v$session

9 where v$lock.type = 'TX'

10 and v$lock.sid = v$session.sid

11 and v$session.username = USER;

USERNAME SID RBS SLOT SEQ LMODE REQUEST --------- ---- --- ---- ------ ----- ------- OPS$TKYTE 145 4 12 16582 6 0 ops$tkyte@ORA10G> select XIDUSN, XIDSLOT, XIDSQN

2 from v$transaction;

XIDUSN XIDSLOT XIDSQN

---------- ---------- ---------- 4 12 16582

      这里有几点很有意思:

1. $LOCK表中的LMODE为6,REQUEST为0。如果在Oracle Server Reference手册中查看V$LOCK表的定义,会发现LMODE=6是一个排他锁。请求(REQUEST)值为0则意味着你没有发出请求;也就是说,你拥有这个锁。

2. 这个表中只有一行。V$LOCK表更应算是一个队列表而不是一个锁表。许多人都认为V$LOCK中会有4行,因为我们锁定了4行。不过,你要记住,Oracle不会在任何地方存储行级锁的列表(也就是说,不会为每一个被锁定的行维护一个主列表)。要查看某一行是否被锁定,必须直接找到这一行[6]。

3. RBS、SLOT和SEQ值与V$TRANSACTION信息匹配。这就是我的事ID。       下面使用同样的用户名启动另一个会话,更新EMP中的某些行,并希望试图更新DEPT:

 ops$tkyte@ORA10G> update emp set ename = upper(ename);

14 rows updated.

ops$tkyte@ORA10G> update dept set deptno = deptno-10;

现在这个会话会阻塞。如果再次运行V$查询,可以看到下面的结果: ops$tkyte@ORA10G> select username,

2 v$lock.sid,

3 trunc(id1/power(2,16)) rbs,

4 bitand(id1,to_number('ffff','xxxx'))+0 slot,

5 id2 seq,

6 lmode,

7 request

8 from v$lock, v$session

 9 where v$lock.type = 'TX'

 10 and v$lock.sid = v$session.sid

11 and v$session.username = USER;

USERNAME SID RBS SLOT SEQ LMODE REQUEST --------- ---- --- ---- ------ ----- ------- OPS$TKYTE

144 4 12 16582 0 6 OPS$TKYTE

144 5 34 1759 6 0 OPS$TKYTE

145 4 12 16582 6 0

ops$tkyte@ORA10G>

select XIDUSN, XIDSLOT, XIDSQN

2 from v$transaction;

XIDUSN XIDSLOT XIDSQN ---------- ---------- ---------- 5 34 1759 4 12 16582

这里可以看到开始了一个新的事务,事务ID是(5,34,1759)。这一次,这个新会话(SID=144)在V$LOCK中有两行。其中一行表示它所拥有的锁(LMODE=6)。另外还有一行,显示了一个值为6的REQUEST。这是一个对排他锁的请求。有意思的是,这个请求行的RBS/SLOT/SEQ值正是锁持有者的事务ID。SID=145的事务阻塞了SID=144的事务。只需执行V$LOCK的一个自联结,就可以更明确地看出这一点:

ops$tkyte@ORA10G> select

 2 (select username from v$session where sid=a.sid) blocker,

3 a.sid,

4 ' is blocking ',

5 (select username from v$session where sid=b.sid) blockee,

6 b.sid

7 from v$lock a, v$lock b

8 where a.block = 1

9 and b.request > 0

10 and a.id1 = b.id1

11 and a.id2 = b.id2;

BLOCKER SID 'ISBLOCKING' BLOCKEE SID --------- ---- ------------- --------- ---- OPS$TKYTE 145 is blocking OPS$TKYTE 144

 现在,如果提交原来的事务(SID=145),并重新运行锁查询,可以看到请求行不见了: ops$tkyte@ORA10G> select username,

2 v$lock.sid,

3 trunc(id1/power(2,16)) rbs,

4 bitand(id1,to_number('ffff','xxxx'))+0 slot,

5 id2 seq,

6 lmode,

7 request

8 from v$lock, v$session

9 where v$lock.type = 'TX'

10 and v$lock.sid = v$session.sid

11 and v$session.username = USER;

USERNAME SID RBS SLOT SEQ LMODE REQUEST --------- ---- --- ---- ------ ----- ------- OPS$TKYTE 144 5 34 1759 6 0

 ops$tkyte@ORA10G> select XIDUSN, XIDSLOT, XIDSQN

2 from v$transaction;

XIDUSN XIDSLOT XIDSQN ---------- ---------- ---------- 5 34 1759

另一个会话一旦放弃锁,请求行就会消失。这个请求行就是排队机制。一旦事务执行,数据库会唤醒被阻塞的会话。当然,利用各种GUI工具肯定能得到更“好看”的显示,但是,必要时对你要查看的表有所了解还是非常有用的。

 

分享到:
评论

相关推荐

    oracle锁机制探讨

    在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁(用来保证表的结构不被用户修改),TX锁称为事务锁或行级锁。当Oracle执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后,系统...

    ORACLE锁深入分析

    根据保护的对象不同,Oracle数据库锁可以分为以下几大类:DML锁(data locks,数据锁),用于保护数据的完整性;DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;内部锁和闩...

    oracle常见的锁查询和处理

    DML事务锁定的机制 ...--DML语句产生的锁 --谁锁住了表,引起了谁的等待 --事务,锁,回滚段 --LOCKED_OBJECTS --出错的分布式事务锁 --分布式事务 --Hold进程 --会话式事务锁 --强制回滚 --杀掉会话进程

    oracle全套ppt教程

    3-oracle之DDL和DML.ppt 6、oracle之数据库对象.PPT 8、oracle之安全.ppt 10、oracle之PLSQL基础.PPT 11、oracle之PLSQL高级.PPT 12、oracle之查询优化.PPT 12、数据库的规范化设计.PPT oracle管理之表空间和数据...

    Oracle 从入门到精通视频教程(11G版本)(ppt)

    第14章-常用工具介绍 什么是SQL*Plus 使用SQL*Plus 使用PL/SQL Developer 第15章-控制文件和日志文件 控制文件与日志文件 初识控制文件 控制文件的多路复用 创建控制文件 日志文件的管理 第16章-表空间的管理...

    oracle Session与lock 解除

    ORACLE里锁有以下几种模式: 0:none 1:null 空 2:Row-S 行共享(RS):共享表锁 3:Row-X 行专用(RX):用于行的修改 4:Share 共享锁(S):阻止其他DML操作 5:S/Row-X 共享行专用(SRX):阻止其他...

    ORACLE9i_优化设计与系统调整

    第一部分 ORACLE系统优化基本知识 23 第1章 ORACLE结构回顾 23 §1.1 Oracle数据库结构 23 §1.1.1 Oracle数据字典 23 §1.1.2 表空间与数据文件 24 §1.1.3 Oracle实例(Instance) 24 §1.2 Oracle文件 26 §1.2.1...

    基于oracle中锁的深入理解

    ORACLE里锁有以下几种模式:0:none1:null 空2:Row-S 行共享(RS):共享表锁3:Row-X 行专用(RX):用于行的修改4:Share 共享锁(S):阻止其他DML操作5:S/Row-X 共享行专用(SRX):阻止其他事务操作6:exclusive 专用...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    ORACLE用户是学习ORACLE数据库中的基础知识,下面就介绍下类系统常用的默认ORACLE用户: 1. sys用户:超级用户,完全是个SYSDBA(管理数据库的人)。拥有dba,sysdba,sysoper等角色或权限。是oracle权限最高的用户,...

    构建最高可用Oracle数据库系统 Oracle 11gR2 RAC管理、维护与性能优化

    15.3.3 DML语句性能调整 15.3.4临时表空间的调整 15.3.5日志文件的调整 15.3.6 UNDO表空间的调整 15.4应用系统 15.4.1应用拆分 15.4.2 SQL执行过程 15.4.3 SQL解析 15.4.4 SQL优化 15.4.5 SQL行源生成 ...

    oracle11g

    第十章:Oracle的事务和锁 第十一章:索引 第十二章:约束 第十三章:视图 第十四章:同义词 第十五章:序列 第三部分:SQL语言的扩展 第十六章:INSERT语句总结 第十七章:DML和DDL语句的其他用法 第十八...

    oracle管理应用工具和sql高级应用视频教程详细完整版

    第三章:Oracle的事务和锁 第四章:使用索引 第五章:约束的作用 第六章:视图、同义词和序列 第七章:Insert语句语法 第八章:DML和DDL语句 第九章:Select的高级应用 第十章:Oracle的国际化支持。 由于文件过大,...

    深入解析Oracle.DBA入门进阶与诊断案例

    8.9.1 从DML更新事务开始 361 8.9.2 获得事务信息 362 8.9.3 获得回滚段名称并转储段头信息 362 8.9.4 获得跟踪文件信息 363 8.9.5 转储前镜像信息 364 8.9.6 转储数据块信息 367 8.9.7 块清除(Block ...

    Oracle Apex Database Monitor:Oracle Apex 数据库监视器-开源

    数据库监控功能: - 实例 - SGA - PGA - 数据库参数 - 缓冲池保留候选 - 版本和补丁实时监控 - 锁 - DDL 锁 - DML 锁 - 库缓存锁 - 等待库缓存 Pin - 会话浏览器 - SQL 语句 - 临时使用- 绑定变量 - SQL 统计 - 段...

    oracle学习经典教程

    1.4.1.2.3 按操作划分,可分为DML 锁(data locks,数据锁)、DDL 锁 (data dictionary lock) 和System Locks。.........84 1.4.1.2.4 DML 锁..........84 1.4.1.2.5 DDL 锁(dictionary locks).........

    2021 云和恩墨大讲堂PPT汇总(50份).zip

    经典知识库:PostgreSQL中的锁 经典知识库:SQL条件等价改写秘笈 如何实现海量数据迁移及落地实践 如何通过APEX 实现标准化运维 如何通过APEX实现标准化运维sql 深入解析:oracle drop table purge内部原理及异常...

    让Oracle跑得更快 Oracle 10g性能分析与优化思路.part2.rar

    8.5.3 并行dml操作 203 8.6 并行执行的设定 210 8.6.1 并行相关的初始化参数 210 8.6.2 并行度的设定 211 8.7 直接加载 213 8.7.1 直接加载和redo 216 8.7.2 直接加载和索引 219 8.7.3 直接加载和并行 221 8.7.4 ...

    最全的oracle常用命令大全.txt

    ORACLE常用命令 一、ORACLE的启动和关闭 1、在单机环境下 要想启动或关闭ORACLE系统必须首先切换到ORACLE用户,如下 su - oracle a、启动ORACLE系统 oracle>svrmgrl SVRMGR>connect internal SVRMGR>startup ...

Global site tag (gtag.js) - Google Analytics