block常见的取值有3个:
0 ->没有阻塞,--只代表没有阻塞,不是没有锁
1 ->正在阻塞,此时可以用如下的语句查一下谁阻碍了谁
2 ->表明这是一个全局的锁,一般发生在rac或ops这样的环境
锁的分类:
0、无
1、NULL,可以某些情况下,如分布式数据库的查询会产生此锁。
2、SS,表结构共享锁
3、SX,表结构共享锁+被操作的记录的排它锁
4、S, 表结构共享锁+所有记录共享锁
5、SRX 表结构共享锁+所有记录排它锁
6、X 表结构排它锁+所有记录排它锁
表上的5种锁的含义:
RS(SS):是一种纯粹的意向锁,它表征事务要通过SELECT FOR UPDATE访问某些行;
RX(SX):是一种纯粹的意向锁,它表征事务要通过 UPDATE/ DELETE/INSERT修改某些行;
S:全表范围的共享锁,不需要在每行上做出标识;
X:全表范围的排它锁,不需要在每行上做出标识;
SRX(SSX):是意向锁RX与S锁的组合,它表征事务既对表加S锁,同时要修改个别行,即要在个别行上加X锁;(如果你使用ORACLE8,可以在一 个表上建立一个自引用,如EMP表上的MGR引用EMPNO,删除一条记录,可以观察到SRX锁)
在行上,ORALCE只有X锁,
但由SELECT FOR UPDATE 获得的X锁在表级表征为RS锁,
由INSERT/UPDATE/DELETE 获得的X锁在表级表征为RX锁,
在巡检期间,检查如果发现有相关的session_wait锁,可按以下步骤查找相应的锁
1. 使用V$LOCK找出session持有的锁。
2. 使用V$SESSION找出持有锁或等待锁的session执行的sql语句。
3. 使用V$SESSION_WAIT找出什么原因导致session持有锁堵塞。
4. 使用V$SESSION获取关于持有锁的程序和用户的更多信息。
V$LOCK中的常用列
? SID:表示持有锁的会话信息。
? TYPE:表示锁的类型。值包括TM和TX等。
? LMODE:表示会话等待的锁模式的信息。用数字0-6表示,和表1相对应。
? REQUEST:表示session请求的锁模式的信息。
? ID1,ID2:表示锁的对象标识。
1、查看相应的v$session_wait信息: --重点看 enq: TX - row lock contention
select event,count(*) from V$SESSION_WAIT group by event order by count(*) desc;
2.查看当前被锁的session正在执行的sql语句
select /*+ NO_MERGE(a) NO_MERGE(b) NO_MERGE(c) */ a.username, a.machine, a.sid, a.serial#, a.last_call_et "Seconds", b.id1, c.sql_text "SQL"
from v$session a, v$lock b, v$sqltext c
where a.username is not null and a.lockwait = b.kaddr and c.hash_value =a.sql_hash_value;
--------------------------------------------------------------
相关语句
1.查看谁锁住了谁。 --L1锁住L2
SELECT L1.SID, ' IS BLOCKING ', L2.SID
FROM V$LOCK L1, V$LOCK L2
WHERE L1.BLOCK = 1
AND L2.REQUEST > 0
AND L1.ID1 = L2.ID1
AND L1.ID2 = L2.ID2;
SELECT substr(DECODE(request,0,'Holder: ','Waiter: ')||sid,1,12) sess,
id1, id2, lmode, request, type, inst_id
FROM GV$LOCK
WHERE (id1, id2, type) IN
(SELECT id1, id2, type FROM GV$LOCK WHERE request>0)
ORDER BY id1, request
;
2.查看TX锁的SID与Serial#:
select sid,serial#,username,state,blocking_session_status,blocking_session
from v$session where event like'%TX%';
第一:kill掉137,6,则是kill掉之后被等的session。
alter system kill session '137,6';
第二:kill掉150,则是kill掉之前阻塞别人的session。
3.查找相应的SQL语句: --被锁的那个SQL
select a.sql_text from v$sqlarea a,v$session b where a.sql_id=b.sql_id and b.event like'%TX%';
***.对各列进行说明
create or replace view dba_lock as
select
sid session_id,
decode(type,
'MR', 'Media Recovery',
'RT', 'Redo Thread',
'UN', 'User Name',
'TX', 'Transaction',
'TM', 'DML',
'UL', 'PL/SQL User Lock',
'DX', 'Distributed Xaction',
'CF', 'Control File',
'IS', 'Instance State',
'FS', 'File Set',
'IR', 'Instance Recovery',
'ST', 'Disk Space Transaction',
'TS', 'Temp Segment',
'IV', 'Library Cache Invalidation',
'LS', 'Log Start or Switch',
'RW', 'Row Wait',
'SQ', 'Sequence Number',
'TE', 'Extend Table',
'TT', 'Temp Table',
type) lock_type,
decode(lmode,
0, 'None', /* Mon Lock equivalent */ --无
1, 'Null', /* N */ --分布式数据库的查询会产生此锁
2, 'Row-S (SS)', /* L */ --表结构共享锁
3, 'Row-X (SX)', /* R */ --表结构共享锁 + 被操作记录的排它锁
4, 'Share', /* S */ --表结构共享锁 + 所有记录的共享锁
5, 'S/Row-X (SSX)', /* C */ --表结构共享锁 + 所有记录的排它锁
6, 'Exclusive', /* X */ --表结构排它锁 + 所有记录的排它锁
to_char(lmode)) mode_held,
decode(request,
0, 'None', /* Mon Lock equivalent */
1, 'Null', /* N */
2, 'Row-S (SS)', /* L */
3, 'Row-X (SX)', /* R */
4, 'Share', /* S */
5, 'S/Row-X (SSX)', /* C */
6, 'Exclusive', /* X */
to_char(request)) mode_requested,
to_char(id1) lock_id1, to_char(id2) lock_id2,
ctime last_convert,
decode(block,
0, 'Not Blocking', /* Not blocking any other processes */
1, 'Blocking', /* This lock blocks other processes */
2, 'Global', /* This lock is global, so we can't tell */
to_char(block)) blocking_others
from v$lock
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23577591/viewspace-682607/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/23577591/viewspace-682607/