以下的文章抓哟是对Oracle锁的运行机制原理的描述我们大家都知道在现代的多用户与多任务系统中出现多个用户同时访问共享的某个对象的几率特别大这个对象可能是表行或者内存结构
为了解决多个用户并发性访问带来的数据的 安全性完整性及一致性问题必须要有一种机制
来使对这些共享资源的并发性访问串行化Oracle锁就可以提供这样的功能当事务在对某个对象进行操作前先向系统发出请求对其加相应的锁加锁后该事务就对该数据对象有了一定的控制权限在该事务释放锁之前其他的事务不能对此数据对象进行更新操作(可以做select动作但select 利用的是undo中的前镜像数据了)
Oracle锁的分类
Oracle锁基本上可以分为二类
a共享锁(share locks) 也称读锁s锁
b排它锁 (exclusive locks) 也称写锁x锁
在数据库中 有两种基本的锁类型排它锁(Exclusive Locks即X锁)和共享锁(Share Locks即S锁)当数据对象被加上排它锁时其他的事务不能对它读取和修改加了共享锁的数据对象可以被其他事务读取但不能修改数据库利用这两 种基本的锁类型来对数据库的事务进行并发控制
按锁保护的内容分类
Oracle提供多粒度封锁机制按保护对象来分据此又可以分为
adml锁 data locks 数据锁用来保护数据的完整性和一致性
bddl锁 dictionary locks 字典锁用来保护数据对象的结构如tableindex的定义
c内部锁和闩 internal locks and latchs 用来保护数据库内部结构如sga内存结构
dml锁
DML锁主要包括TM锁和TX锁其中TM锁称为表级锁TM锁的种类有SXSRSXSRX五种TX锁称为事务锁或行级 锁当Oracle执行deleteupdateinsertselect 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锁包括了SSSXSX等多种模式在数据库中用-来表示不同的SQL操作产生不同类型的TM锁如表所示
和锁相关的性能视图介绍
v$lock
SID 会话的sid可以和v$session 关联
TYPE 区分该锁保护对象的类型如tmtxrtmr等
ID 锁表示详细见下说明
ID 锁表示详细见下说明
LMODE 锁模式见下面说明
REQUEST 申请的Oracle锁模式同lmode
CTIME 已持有或者等待锁的时间
BLOCK 是否阻塞其他会话锁申请 :阻塞 :不阻塞
LMODE取值 数字越大锁级别越高 影响的操作越多
级锁
Select有时会在v$locked_object出现
级锁即RS锁
相应的sql有Select for update Lock xxx in Row Share modeselect for update
当对话使用for update子串打开一个游标时所有返回集中的数据行都将处于行级(RowX)独占式Oracle锁定其他对象只能查询这些数据行不能进行updatedelete或select for update操作