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/AS√×√××√X×××××√RS√×√√√√RX××√√×√SRX××√××√N/A√√√√√√
lock table in [row share][row exclusive][share][share row exclusive][exclusive] mode;
SQL语句表锁定模允许的表锁定模式Select * from ……RSRS、RX、S、SRX、XInsert into ……RXRS、RXUpdate ……RXRS、RXDelete from ……RXRS、RXSelect * from for updateRSRS、RX、S、SRXlock table in row share modeRSRS、RX、S、SRXlock table in row exclusive modeRXRS、RXlock table in share modeSRS、Slock table in share row exclusive modeSRXRSlock table in exclusive modeXRS
表1 Oracle的TM锁类型锁模式锁描述解释SQL操作0none 1NULL空Select2SS(Row-S)行级共享锁,其他对象只能查询这些数据行Select for update、Lock for update、Lock row share3SX(Row-X)行级排它锁,在提交前不允许做DML操作Insert、Update、Delete、Lock row share4S(Share)共享锁Create index、Lock share5SSX(S/Row-X)共享行级排它锁Lock share row exclusive6X(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一致。
v$lockSID 会话的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 mode5级锁即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 ExclusivemodeID1,ID2的取值含义根据type的取值而有所不同对于TM 锁ID1表示被锁定表的object_id 可以和dba_objects视图关联取得具体表信息,ID2 值为0对于TX 锁 ID1以十进制数值表示该事务所占用的回滚段号和事务槽slot number号,其组形式: 0xRRRRSSSS,RRRR=RBS/UNDO NUMBER,SSSS=SLOT NUMBERID2 以十进制数值表示环绕wrap的次数,即事务槽被重用的次数
v$locked_objectXIDUSN 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.lmodeDba_locks 和v$lock 内容差不多,略V$session 如果某个session被因为某些行被其他会话锁定而阻塞,则该视图中的下面四个字段列出了这些行所属对象的相关信息ROW_WAIT_FILE# 等待的行所在的文件号ROW_WAIT_OBJ# 等待的行所属的object_idROW_WAIT_BLOCK# 等待的行所属的blockROW_WAIT_ROW# 等待的行在blcok中的位置
alter system kill session 'sid,serial#';