首页 > Linux操作系统 > Linux操作系统 > oracle lock系列一
/***********v$lock官方**************/
http://docs.oracle.com/cd/E11882_01/server.112/e25513/dynviews_2027.htm#REFRN30121
oracle lock
------------------------------------------------------------------
/***************锁类型****************/
1,根据操作行为及性质的不同,lock type锁类型分为;
共享锁shared locks
排它锁exclusive locks
2,exclusive locks产生,和获取表或表的一条记录资源有关;
而shared locks基于数据库某个获取资源时产生
/***********锁模式******************/
3,lock modes持锁的模式
4,lock mode和并发有关;持锁模式级别高一些,并发就会低一些;
相反则更高一些;
5,lock mode由oracle动态调节其级别以保证合理的并发访问
6,lock mode分为:
排它锁模式exclusive lock mode
共享锁模式share lock mode
7,排它锁模式
修改数据会产生此模式
第一个锁定资源的事务会以此模式持有资源,其它事务不能修改此数据
8,共享锁模式
多个用户会话可以同时持有此模式同时读取数据
此模式防止并发访问某些用户会话申请排它锁
9,select * for update语句产生一个行级排它锁 和 一个行级共享表锁
10,行级排它锁防止其它事务修改此行
11,行级共享表锁防止其它事务修改表的结构
------------------------------------------------------------------------
/******************锁转化************************/
12,lock conversion锁转化
13,锁转化由oracle自动完成
14,锁转化针对锁模式,即由低级的锁模式转化为高级的锁模式(模式越高,对于资源访问控制越严格)
15,比如:一个事务先运行了select * for update;后又更新了此锁定的记录;这种情况下;
oracle自动把之前select * for update的锁模式由行级共享表锁转化为行级排它表锁
16,高级别的锁模式不需要锁转化
/*************锁扩大****************/
锁扩大lock escalation
1,锁扩大与锁转化不是一回事
2,锁扩大会加大死锁的可能性
3,比如:事务1锁定表的一些记录,锁扩大的表锁;而事务也正在更新此表的一些记录,也进行锁扩大,此时就产生了死锁;
都想去竞争表锁
/*****************锁的类型**************************/
1,根据事务操作的资源类型有:
1,dml locks
1,table lock锁定整个表
2,row lock锁定选中的表记录
2,ddl locks
1,保护模式对象比如表或视图的结构定义
3,system locks
1,保护oracle内部的一些资源对象结构或者数据结构的定义
2,比如:datafile
latch
mutex
internal
3,它是由oracle自动化控制
/*******************上述锁的类型:依次展开说明*****************/
1,dml locks
1,table lock锁定整个表
2,row lock锁定选中的表记录
2,dml locks
1,自动获取2种类型的锁
2,row lock(tx)
table lock(tm)
/*******row lock**********/
1,row lock也叫tx lock,它针对表的一条记录
2,运行insert,delete,update,merge,select for update更新一条表记录会产生row lock
3,而且oracle同时自动会产生一个subexclusive lock on table
/******table lock **********/
1,也叫tm lock
2,某个事务运行insert,delete,update,merge,select for update,lock table产生table lock
3,table lock的功能:
1,防止其它事务并发修改相同的资源
2,防止ddl操作并发修改资源的结构定义,比如:正在更新表或视图的一条记录时,不能进行ddl操作
/******获取table lock表锁的几种模式************/
1,row share(rs)
1,也叫subshare table lock(ss)
2,某事务锁住表的一些记录,准备更新
3,它是最低级别的锁模式,提供最大范围的并发
2,row exclusive table lock(rx)
1,也叫subexclusive table lock(sx)
2,事务已更新了表中一些记录或者select for update会获取此锁模式
3,此锁模式允许其它事务在一个表同时执行select,insert,delete,update,lock rows
4,此锁模式允许多事务获取sx及subshare table lock(for the same table)
3,share table lock(s)
1,此模式允许其它事务select表,注意此select不能是select for update;
2,此模式允许多个事务获取此模式
3,此模式不能确保一个事务修改表的数据
4,share row exclusive table lock(srx)
1,也叫share-subexclusive table lock(ssx)
2,它比share table lock更严格,级别更低
3,同一时间,基于同一个表,只能有一个事务获取此模式的锁
4,此模式允许其它事务select表,但不能是select for update;
5,此模式不允许其它事务修改表
5,exclusive table lock(x)
1,此模式最牛,最高级,最严格
2,此模式不允许进行任何的dml操作
3,此模式不允许再获取其它类型的锁
/***************ddl lock***********************************/
1,ddl locks
1,保护模式对象比如表或视图的结构定义
2,ddl lock
1,在进行ddl操作前获取ddl lock
2,防止ddl操作期间,修改对象的结构定义
3,ddl lock获取和释放由oracle自动控制
3,ddl lock的模式
1,exclusive ddl lock
1,防止其它会话获取ddl lock或dml lock
2,大多情形,除了下述的share ddl lock的ddl操作,需要exclusive ddl lock,防止其它ddl破环资源结构定义
3,比如:正在drop table时,不允许alter table add column或者alter table
2,share ddl lock
1,防止其它ddl操作产生冲突
2,却允许其它类似的ddl并发操作
3,比如:当你正在运行create procedure时,此事务则会获取要创建存储过程所引用的对象的share ddl lock;
而此时其它并发会话也可以获取基于此存储过程所引用对象的share ddl lock
但注意:其它事务不能获取基于此存储过程所引用对象的exclusive ddl lock
/*************breakable parse locks易碎的解析锁*******************/
1,parse lock由模式对象引用的sql或plsql语句或代码块持有
2,持有此锁的目的,如果sql或plsql引用的对象被drop or alter,以便相关的shared sql area变更为invalidate无效
(也就是说只有有了这个锁,共享池中shared sql area的sql or plsql一旦引用对象变化了,其share sql area才可以变为无效)
3,此锁不允许任何ddl操作
4,此锁产生于share pool共享池
5,解析sql会获取此锁(解析sql要查看sql所引用对象是否发生过变化,从而决定shared pool中的share sql area是否有否,否则变更为无效;这个期间要获取此锁)
6,只要针对sql的share sql area在共享池,就要持此锁,注意是针对sql的share sql area,二者不一回事
/********system locks系统锁*****************/
1,oracle自动控制
2,保护oracle内部一些资源结构和内存结构
3,latch
1,简单而低级的序列机制
2,协调保护多用户存取访问共享数据结构,对象,文件,共享内存结构或资源
3,比如:latch会保护sga上面的多个对象;dbwr和lgwr后台进程要从共享池中分配内存;
创建数据结构;为了分配内存,这些后台进程就会获取shared pool latch,
序列化访问共享池;
分配内存之后,其它进程可能要访问shared pool中的library cache,
library cache主要用于解析;
此时,这些进程就会获取library cache latch,而非整个共享池的shared pool latch
4,latch不允许排队;即获取到一个latch,获取到latch的会话以排它模式持有latch;
其它会话只能等待
5,latch spinning何时发生呢,一个进程重复请求一个latch;
6,latch sleeping何时发生呢,一个时程在请求latch之前会释放cpu资源
(小结:所以latch spinning会严重占用cpu,而后者较之就好得多
4,mutex
1,也叫mutual exclusion object,mutex是它的简写
2,它是一种低级机制,防止多并发进程导致内存对象老化(挤出内存)或者被破坏
3,它和latch很类似
4,但是latch一般会保护多个对象,而mutex仅保护一个对象
5,mutex的作用
1,减少竞争的可能性
2,因为latch保护多个对象,如果多进程并发访问这些对象;还是会产生对于latch的竞争;
而mutex只是一个对象;产生竞争的可能就大大降低了
3,它占用的内存比latch更少
4,如mutex处于共享模式,允许多并发会话同时引用它
/***********internal lock内部锁**************/
1,和latch及mutex相比,它是一种高级,更为复杂的机制
2,它的作用很多
3,数据库使用如下几种类型的内部锁
1,dictionary cache locks
1,持有它的时间非常短
2,用于读取或修改dictionary cache的条目时,持有此锁
3,确保被解析的sql不会看到不一致的对象定义(dictionary cache存储表或数据字典定义的元结构)
4,此锁可用共享或排它模式
5,sql解析完成共享模式锁被释放
6,ddl操作完成后排它模式被释放
2,file and log mangement locks
1,主要用于保护各种文件
2,比如:保护控制文件一个时间点只能有一个进程修改它
3,多个实例以共享模式mount database,而一个实例以排它模式mount database
4,保护日志文件
3,tablespace and undo segment locks
1,保护表空间和undo segment
2,比如:在rac环境下,多实例必须要达成一致基于某个表空间是否为在线或离线;
3,undo segment被锁住,确保仅一个实例可以写入数据
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9240380/viewspace-758118/ ,如需转载,请注明出处,否则将追究法律责任。