oracle锁一些知识Word格式文档下载.docx
- 文档编号:16611437
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:13
- 大小:28.89KB
oracle锁一些知识Word格式文档下载.docx
《oracle锁一些知识Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《oracle锁一些知识Word格式文档下载.docx(13页珍藏版)》请在冰豆网上搜索。
S√×
√×
×
√
X×
RS√×
√√√√
RX×
√√×
SRX×
N/A√√√√√√
从前面的描述中可以看到,我们不仅可以通过发出DML语句的方式,由Oracle自动在表级别上添加TM锁。
我们还可以通过发出locktable命令主动地在表级别上添加TM锁,并在该命令中可以指定不同的锁定模式,其命令格式如下所示:
lock
table
in
[row
share][row
exclusive]
[share][share
row
exclusive][exclusive]
mode;
locktablein[rowshare][rowexclusive]
[share][sharerowexclusive][exclusive]mode;
对Oracle数据库中的各SQL语句所产生的表级锁的情况进行汇总,如下表所示:
SQL语句
表锁定模
允许的表锁定模式
Select
*
from
……
RS、RX、S、SRX、X
Insert
into
RS、RX
Update
Delete
for
update
RS、RX、S、SRX
share
mode
exclusive
RS、S
RS
SQL语句表锁定模允许的表锁定模式
Select*from……RSRS、RX、S、SRX、X
Insertinto……RXRS、RX
Update……RXRS、RX
Deletefrom……RXRS、RX
Select*fromforupdateRSRS、RX、S、SRX
locktableinrowsharemodeRSRS、RX、S、SRX
locktableinrowexclusivemodeRXRS、RX
locktableinsharemodeSRS、S
locktableinsharerowexclusivemodeSRXRS
locktableinexclusivemodeXRS
对于通过locktable命令主动添加的锁定来说,如果要释放它们,只需要发出rollback命令即可。
Oracle数据库的锁类型
根据保护的对象不同,Oracle数据库锁可以分为以下几大类:
DML锁(datalocks,数据锁),用于保护数据的完整性;
DDL锁(dictionarylocks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;
内部锁和闩(internallocksandlatches),保护数据库的内部结构。
DML锁的目的在于保证并发情况下的数据完整性,本文主要讨论DML锁。
在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。
当Oracle执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。
当TM锁获得后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位。
这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。
TM锁包括了SS、SX、S、X等多种模式,在数据库中用0-6来表示。
不同的SQL操作产生不同类型的TM锁。
如表1所示。
在数据行上只有X锁(排他锁)。
在Oracle数据库中,当一个事务首次发起一个DML语句时就获得一个TX锁,该锁保持到事务被提交或回滚。
当两个或多个会话在表的同一条记录上执行DML语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。
当第一个会话提交后,TX锁被释放,其他会话才可以加锁。
当Oracle数据库发生TX锁等待时,如果不及时处理常常会引起Oracle数据库挂起,或导致死锁的发生,产生ORA-60的错误。
这些现象都会对实际应用产生极大的危害,如长时间未响应,大量事务失败等。
TX锁等待的分析
在介绍了有关地Oracle数据库锁的种类后,下面讨论如何有效地监控和解决锁等待现象,及在产生死锁时如何定位死锁的原因。
监控锁的相关视图数据字典是Oracle数据库的重要组成部分,用户可以通过查询数据字典视图来获得数据库的信息。
和锁相关的数据字典视图如表2所示。
TX锁等待的监控和解决在日常工作中,如果发现在执行某条SQL时数据库长时间没有响应,很可能是产生了TX锁等待的现象。
为解决这个问题,首先应该找出持锁的事务,然后再进行相关的处理,如提交事务或强行中断事务。
死锁的监控和解决在数据库中,当两个或多个会话请求同一个资源时会产生死锁的现象。
死锁的常见类型是行级锁死锁和页级锁死锁,Oracle数据库中一般使用行级锁。
下面主要讨论行级锁的死锁现象。
当Oracle检测到死锁产生时,中断并回滚死锁相关语句的执行,报ORA-00060的错误并记录在数据库的日志文件alertSID.log中。
同时在user_dump_dest下产生了一个跟踪文件,详细描述死锁的相关信息。
在日常工作中,如果发现在日志文件中记录了ora-00060的错误信息,则表明产生了死锁。
这时需要找到对应的跟踪文件,根据跟踪文件的信息定位产生的原因。
如果查询结果表明,死锁是由于bitmap索引引起的,将IND_T_PRODUCT_HIS_STATE索引改为normal索引后,即可解决死锁的问题。
表1
Oracle的TM锁类型
锁模式
锁描述
解释
SQL操作
0
none
1
NULL
空
Select
2
SS(Row-S)
行级共享锁,其他对象只能查询这些数据行
update、Lock
share
3
SX(Row-X)
行级排它锁,在提交前不允许做DML操作
Insert、Update、Delete、Lock
4
S(Share)
共享锁
Create
index、Lock
5
SSX(S/Row-X)
共享行级排它锁
Lock
exclusive
6
X(Exclusive)
排它锁
Alter
table、Drop
able、Drop
index、Truncate
、Lock
表1Oracle的TM锁类型
锁模式锁描述解释SQL操作
0none
1NULL空Select
2SS(Row-S)行级共享锁,其他对象只能查询这些数据行
Selectforupdate、Lockforupdate、Lockrowshare
3SX(Row-X)行级排它锁,在提交前不允许做DML操作
Insert、Update、Delete、Lockrowshare
4S(Share)共享锁Createindex、Lockshare
5SSX(S/Row-X)共享行级排它锁Locksharerowexclusive
6X(Exclusive)排它锁
Altertable、Dropable、Dropindex、Truncatetable、Lockexclusive
表2
数据字典视图说明
视图名
描述
主要字段说明
v$session
查询会话的信息和锁的信息。
sid,serial#:
表示会话信息。
program:
表示会话的应用程序信息。
row_wait_obj#:
表示等待的对象。
和dba_objects中的object_id相对应。
v$session_wait
查询等待的会话信息。
sid:
表示持有锁的会话信息。
Seconds_in_wait:
表示等待持续的时间信息
Event:
表示会话等待的事件。
v$lock
列出系统中的所有的锁。
Sid:
Type:
表示锁的类型。
值包括TM和TX等。
ID1:
表示锁的对象标识。
lmode,request:
表示会话等待的锁模式的信息。
用数字0-6表示,和表1相对应。
dba_locks
对v$lock的格式化视图。
Session_id:
和v$lock中的Sid对应。
Lock_type:
和v$lock中的type对应。
Lock_ID1:
和v$lock中的ID1对应。
Mode_held,mode_requested:
和v$lock中
的lmode,request相对应。
v$locked_object
只包含DML的锁信息,包括回滚段和会话信息。
Xidusn,xidslot,xidsqn:
表示回滚段信息。
和
v$transaction相关联。
Object_id:
表示被锁对象标识。
Locked_mode:
表示会话等待的锁模式的信息,和v$lock中的lmode一致。
表2数据字典视图说明
视图名描述主要字段说明
v$session查询会话的信息和锁的信息。
v$session_wait查询等待的会话信息。
表示等待持续的时间信息
v$lock列出系统中的所有的锁。
dba_locks对v$lock的格式化视图。
和v$lock中的ID1对应。
和v$lock中
v$locked_object只包含DML的锁信息,包括回滚段和会话信息。
和
=====================================================================
按锁保护的内容分类
oracle提供多粒度封锁机制,按保护对象来分,据此又可以分为
a:
dml锁,datalocks数据锁,用来保护数据的完整性和一致性
b:
ddl锁,dictionarylocks字典锁,用来保护数据对象的结构,如table,index的定义
c:
内部锁和闩internallocksandlatchs用来保护数据库内部结构,如sga内存结构
dml锁
DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TM锁的种类有S,X,SR,SX,SRX五种,TX锁称为事务锁或行级锁。
当Oracle执行delete,update,insert,selectforupdate
DML语句时,oracle首先自动在所要操作的表上申请TM类型的锁。
当TM锁获得后,再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位(lb即lockbytes)进行置位。
在记录被某一会话锁定后,其他需要访问被锁定对象的会话会按先进先出的方式等待锁的释放,对于select操作而言,并不需要任何锁,所以即使记录被锁定,select语句依然可以执行,实际上,在此情况下,oracle是用到undo的内容进行一致性读来实现的。
在数据行上只有X锁(排他锁),就是说TX锁只能是排他锁,在记录行上设置共享锁没有意义。
在数据表上,oracle默认是共享锁,在执行dml语句的时候,oracle会先申请对象上的共享锁,防止其他会话在这个对象上做ddl语句,成功申请表上的共享锁后,再在受影响的记录上加排它所,防止其他会话对这些做修改动作。
和锁相关的性能视图介绍
v$lock
SID
会话的sid,可以和v$session
关联
TYPE
区分该锁保护对象的类型,如tm,tx,rt,mr等
ID1
锁表示1,详细见下说明
ID2
锁表示2,详细见下说明
LMODE
锁模式,见下面说明
REQUEST
申请的锁模式,同lmode
CTIME
已持有或者等待锁的时间
BLOCK
是否阻塞其他会话锁申请
1:
阻塞
0:
不阻塞
LMODE取值0,1,2,3,4,5,6,
数字越大锁级别越高,
影响的操作越多。
1级锁:
Select,有时会在v$locked_object出现。
2级锁即RS锁
相应的sql有:
Lock
xxx
Row
Share
mode,select
update当对
话使用for
update子串打开一个游标时,所有返回集中的数据行都将处于行级(Row-X)独
占式锁定,其他对象只能查询这些数据行,不能进行update、delete或select
update
操作。
3级锁即RX锁
Insert,
Update,
Delete,
Exclusive
mode,没有commit
之前插入同样的一条记录会没有反应,
因为后一个3的锁会一直等待上一个3的锁,
我们
必须释放掉上一个才能继续工作。
4级锁即S锁
Index,
mode
5级锁即SRX锁
mode,当有主外键约束时update
/delete
...
;
可能会产生4,5的锁。
6级锁即X锁
table,
Drop
Truncate
Exclusive
ID1,ID2的取值含义根据type的取值而有所不同
对于TM
锁
ID1表示被锁定表的object_id
可以和dba_objects视图关联取得具体表信息,ID2
值为0
对于TX
ID1以十进制数值表示该事务所占用的回滚段号和事务槽slot
number号,其组形式:
0xRRRRSSSS,RRRR=RBS/UNDO
NUMBER,SSSS=SLOT
NUMBER
以十进制数值表示环绕wrap的次数,即事务槽被重用的次数
v$lock
SID会话的sid,可以和v$session关联
TYPE区分该锁保护对象的类型,如tm,tx,rt,mr等
ID1锁表示1,详细见下说明
ID2锁表示2,详细见下说明
LMODE锁模式,见下面说明
REQUEST申请的锁模式,同lmode
CTIME已持有或者等待锁的时间
BLOCK是否阻塞其他会话锁申请1:
阻塞0:
不阻塞
LMODE取值0,1,2,3,4,5,6,数字越大锁级别越高,影响的操作越多。
2级锁即RS锁
Selectforupdate,LockxxxinRowSharemode,selectforupdate当对
话使用forupdate子串打开一个游标时,所有返回集中的数据行都将处于行级(Row-X)独
占式锁定,其他对象只能查询这些数据行,不能进行update、delete或selectforupdate
3级锁即RX锁
Insert,Update,Delete,LockxxxinRowExclusivemode,没有commit
之前插入同样的一条记录会没有反应,因为后一个3的锁会一直等待上一个3的锁,我们
4级锁即S锁
CreateIndex,LockxxxinSharemode
5级锁即SRX锁
LockxxxinShareRowExclusivemode,当有主外键约束时update
/delete...;
可能会产生4,5的锁。
6级锁即X锁
Altertable,Droptable,DropIndex,Truncatetable,LockxxxinExclusive
mode
ID1,ID2的取值含义根据type的取值而有所不同
对于TM锁
ID1表示被锁定表的object_id可以和dba_objects视图关联取得具体表信息,ID2值为0
对于TX锁
ID1以十进制数值表示该事务所占用的回滚段号和事务槽slotnumber号,其组形式:
0xRRRRSSSS,RRRR=RBS/UNDONUMBER,SSSS=SLOTNUMBER
ID2以十进制数值表示环绕wrap的次数,即事务槽被重用的次数
v$locked_object
XIDUSN
undo
segment
number
,
可以和v$transaction关联
XIDSLOT
slot
XIDSQN
序列号
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- oracle 一些 知识
![提示](https://static.bdocx.com/images/bang_tan.gif)