oracle标志位作用是什么意思,oracle锁一些学问

oracle锁一些知识

表级锁共具有五种模式,如下所示。

行级排他锁(Row Exclusive,简称RX锁)

当我们进行DML时会自动在被更新的表上添加RX锁,或者也可以通过执行lock命令显式的在表上添加RX锁。在该锁定模式下,允许其他的事务通过DML语句修改相同表里的其他数据行,或通过lock命令对相同表添加RX锁定,但是不允许其他事务对相同的表添加排他锁(X锁)。

行级共享锁(Row Shared,简称RS锁)

通常是通过select … from for update语句添加的,同时该方法也是我们用来手工锁定某些记录的主要方法。比如,当我们在查询某些记录的过程中,不希望其他用户对查询的记录进行更新操作,则可以发出这样的语句。当数据使用完毕以后,直接发出rollback命令将锁定解除。当表上添加了RS锁定以后,不允许其他事务对相同的表添加排他锁,但是允许其他的事务通过DML语句或lock命令锁定相同表里的其他数据行。

共享锁(Share,简称S锁)

通过lock table in share mode命令添加该S锁。在该锁定模式下,不允许任何用户更新表。但是允许其他用户发出select …from for update命令对表添加RS锁。

排他锁(Exclusive,简称X锁)

通过lock table in exclusive mode命令添加X锁。在该锁定模式下,其他用户不能对表进行任何的DML和DDL操作,该表上只能进行查询。

共享行级排他锁(Share Row Exclusive,简称SRX锁)

通过lock table in share row exclusive mode命令添加SRX锁。该锁定模式比行级排他锁和共享锁的级别都要高,这时不能对相同的表进行DML操作,也不能添加共享锁。

这五种模式的TM锁的兼容关系如下表所示(√表示互相兼容的请求;×表示互相不兼容的请求;N/A表示没有锁定请求):

-SXRSRXSRXN/A

S√×√××√

X×××××√

RS√×√√√√

RX××√√×√

SRX××√××√

N/A√√√√√√

从前面的描述中可以看到,我们不仅可以通过发出DML语句的方式,由Oracle自动在表级别上添加TM锁。我们还可以通过发出lock table命令主动地在表级别上添加TM锁,并在该命令中可以指定不同的锁定模式,其命令格式如下所示:

lock table in [row share][row exclusive]

[share][share row exclusive][exclusive] mode;

对Oracle数据库中的各SQL语句所产生的表级锁的情况进行汇总,如下表所示:

SQL语句表锁定模允许的表锁定模式

Select * from ……RSRS、RX、S、SRX、X

Insert into ……RXRS、RX

Update ……RXRS、RX

Delete from ……RXRS、RX

Select * from for updateRSRS、RX、S、SRX

lock table in row share modeRSRS、RX、S、SRX

lock table in row exclusive modeRXRS、RX

lock table in share modeSRS、S

lock table in share row exclusive modeSRXRS

lock table in exclusive modeXRS

对于通过lock table命令主动添加的锁定来说,如果要释放它们,只需要发出rollback命令即可。

Oracle数据库的锁类型

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

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操作

0none

1NULL空Select

2SS(Row-S)行级共享锁,其他对象只能查询这些数据行

Select for update、Lock for update、Lock row share

3SX(Row-X)行级排它锁,在提交前不允许做DML操作

Insert、Update、Delete、Lock row share

4S(Share)共享锁Create index、Lock share

5SSX(S/Row-X)共享行级排它锁Lock share row exclusive

6X(Exclusive)排它锁

Alter table、Drop able、Drop index、Truncate table 、Lock exclusive

表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:表示被锁对象标识。

Session_id:表示持有锁的会话信息。

Locked_mode:表示会话等待的锁模式的信息,和v$lock中的lmode一致。

=====================================================================

按锁保护的内容分类

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操作而言,并不需要任何锁,所以即使记录被锁定,select语句依然可以执行,实际上,在此情况下,oracle是用到undo的内容进行一致性读来实现的。

在 Oracle数据库中,当一个事务首次发起一个DML语句时就获得一个TX锁,该锁保持到事务被提交或回滚。在数据行上只有X锁(排他锁),就是说TX锁只能是排他锁,在记录行上设置共享锁没有意义。当两个或多个会话在表的同一条记录上执行DML语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。当第一个会话提交后,TX锁被释放,其他会话才可以加锁。

在数据表上,oracle默认是共享锁,在执行dml语句的时候,oracle会先申请对象上的共享锁,防止其他会话在这个对象上做ddl语句,成功申请表上的共享锁后,再在受影响的记录上加排它所,防止其他会话对这些做修改动作。

这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。TM锁包括了SS、SX、S、X等多种模式,在数据库中用0-6来表示。不同的SQL操作产生不同类型的TM锁。如表1所示。

和锁相关的性能视图介绍

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有:Select for update ,Lock xxx in Row Share mode,select for update当对

话使用for update子串打开一个游标时,所有返回集中的数据行都将处于行级(Row-X)独

占式锁定,其他对象只能查询这些数据行,不能进行update、delete或select for update

操作。

3级锁即RX锁

相应的sql有:Insert, Update, Delete, Lock xxx in Row Exclusive mode,没有commit

之前插入同样的一条记录会没有反应, 因为后一个3的锁会一直等待上一个3的锁, 我们

必须释放掉上一个才能继续工作。

4级锁即S锁

相应的sql有:Create Index, Lock xxx in Share mode

5级锁即SRX锁

相应的sql有:Lock xxx in Share Row Exclusive mode,当有主外键约束时update

/delete ... ; 可能会产生4,5的锁。

6级锁即X锁

相应的sql有:Alter table, Drop table, Drop Index, Truncate table, Lock xxx in Exclusive

mode

ID1,ID2的取值含义根据type的取值而有所不同

对于TM 锁

ID1表示被锁定表的object_id 可以和dba_objects视图关联取得具体表信息,ID2 值为0

对于TX 锁

ID1以十进制数值表示该事务所占用的回滚段号和事务槽slot number号,其组形式:

0xRRRRSSSS,RRRR=RBS/UNDO NUMBER,SSSS=SLOT NUMBER

ID2 以十进制数值表示环绕wrap的次数,即事务槽被重用的次数

v$locked_object

XIDUSN undo segment number , 可以和v$transaction关联

XIDSLOT undo slot number

XIDSQN 序列号

OBJECT_ID 被锁定对象的object_id , 可以和dba_objects关联

SESSION_ID 持有该锁的session_id, 可以和v$session关联

ORACLE_USERNAME 持有该锁的oracle帐号

OS_USER_NAME 持有该锁的操作系统帐号

PROCESS 操作系统的进程号,可以和v$process关联

LOCKED_MODE 锁模式,含义同v$lock.lmode

Dba_locks 和v$lock 内容差不多,略

V$session 如果某个session被因为某些行被其他会话锁定而阻塞,则该视图中的下面四个字段列出了这些行所属对象的相关信息

ROW_WAIT_FILE# 等待的行所在的文件号

ROW_WAIT_OBJ# 等待的行所属的object_id

ROW_WAIT_BLOCK# 等待的行所属的block

ROW_WAIT_ROW# 等待的行在blcok中的位置

手工释放锁

alter system kill session 'sid,serial#';

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值