Oracle锁的运行机制原理的描述
以下的文章抓哟是对Oracle锁的运行机制原理的描述 我们大家都知道在现代的多用户与多任务系统中 出现多个用户同时访问共享的某个对象的几率特别大 这个对象可能是表 行 或者内存结构
为了解决多个用户并发性访问带来的数据的 安全性 完整性及一致性问题 必须要有一种机制
来使对这些共享资源的并发性访问串行化 Oracle锁就可以提供这样的功能 当事务在对某个对象进行操作前 先向系统发出请求 对其加相应的锁 加锁后该事务就对该数据对象有了一定的控制权限 在该事务释放锁之前 其他的事务不能对此数据对象进行更新操作(可以做select动作 但select 利用的是undo中的前镜像数据了)
Oracle锁的分类
Oracle锁基本上可以分为二类
a 共享锁(share locks) 也称读锁 s锁
b 排它锁 (exclusive locks) 也称写锁 x锁
在数据库中 有两种基本的锁类型 排它锁(Exclusive Locks 即X锁)和共享锁(Share Locks 即S锁) 当数据对象被加上排它锁时 其他的事务不能对它读取和修改 加了共享锁的数据对象可以被其他事务读取 但不能修改 数据库利用这两 种基本的锁类型来对数据库的事务进行并发控制
按锁保护的内容分类
Oracle提供多粒度封锁机制 按保护对象来分 据此又可以分为
a dml锁 data locks 数据锁 用来保护数据的完整性和一致性
b ddl锁 dictionary locks 字典锁 用来保护数据对象的结构 如table index的定义
c 内部锁和闩 internal locks and latchs 用来保护数据库内部结构 如sga内存结构
dml锁
DML锁主要包括TM锁和TX锁 其中TM锁称为表级锁 TM锁的种类有S X SR SX SRX五种 TX锁称为事务锁或行级 锁 当Oracle执行delete update insert select for update DML语句时 Oracle首先自动在所要操作的表上申请TM类型的锁
当TM锁获得后 再自动申请TX类型的锁 并将实际锁定的数据行的锁标志位(lb 即lock bytes)进行置位 在记录被某一会话锁定后 其他需要访问被锁定对象的会话会按先进先出的方式等待锁的释放 对于select操作而言 并不需要任何 Oracle锁 所以即使记录被锁定 select语句依然可以执行 实际上 在此情况下 Oracle是用到undo的内容进行一致性读来实现的
在 Oracle数据库中 当一个事务首次发起一个DML语句时就获得一个TX锁 该锁保持到事务被提交或回滚 在数据行上只有X锁(排他锁) 就是说TX锁 只能是排他锁 在记录行上设置共享锁没有意义 当两个或多个会话在表的同一条记录上执行DML语句时 第一个会话在该条记录上加锁 其他的会话处于等待状 态 当第一个会话提交后 TX锁被释放 其他会话才可以加锁
在数据表上 Oracle默认是共享锁 在执行dml语句的时候 Oracle会先申请对象上的共享锁 防止其他会话在这个对象上做ddl语句 成功申请表上的共享锁后 再在受影响的记录上加排它所 防止其他会话对这些做修改动作
这样在事务加锁前检查TX锁相容性时就不用再逐行检查Oracle锁标志 而只需检查TM锁模式的相容性即可 大大提高了系统的效率 TM锁包括了SS SX S X等多种模式 在数据库中用 - 来表示 不同的SQL操作产生不同类型的TM锁 如表 所示
和锁相关的性能视图介绍
v$lock
SID 会话的sid 可以和v$session 关联
TYPE 区分该锁保护对象的类型 如tm tx rt mr等
ID 锁表示 详细见下说明
ID 锁表示 详细见下说明
LMODE 锁模式 见下面说明
REQUEST 申请的Oracle锁模式 同lmode
CTIME 已持有或者等待锁的时间
BLOCK 是否阻塞其他会话锁申请 :阻塞 :不阻塞
LMODE取值 数字越大锁级别越高 影响的操作越多
级锁
Select 有时会在v$locked_object出现
级锁即RS锁
相应的sql有 Select for update Lock xxx in Row Share mode select for update
lishixinzhi/Article/program/Oracle/201311/16509