oracle锁的管理。[@more@]
锁的种类:
数据锁DML,字典锁DDL,表锁TM,事务锁TX,人工锁定
DML锁的模式
1:空
2:行共享(RS):行共享是一个共享表锁,它用于专用锁。
3:行专用(RX):用于行的修改
4:共享锁(S):阻止其他DML操作
5:共享行专用(SRX):阻止其他事务操作
6:专用(X):独立访问使用
V$LOCK
字段内容:SID,TYPE,ID1,ID2,LMODE,REQUEST,CTIME,BLOCK
TYPE:TX(TM,DML,表锁),MR介质恢复,ST磁盘空间管理
LMODE/REQUEST:01:空, 2:RS, 3:RX 4:S 5:SRX 6:X
LMODE:0,1表明进程已经获得一个锁,非0,等待获得一个琐
ID1:TX状态下,等待锁的对象ID,TM状态下,回滚号码的十进制
ID2:TM:0 TX:回滚槽重新使用的次数
V$session_wait
列举了活动会话正在等待的事件,其中P2TEXT,P3TEXT能从V$LOCK中取得
V$SYSSTAT
包含对整个系统的所有重要的统计信息,可以使用v$sysstat对每一个会话等待锁定的次数进行统计
有用的SQL:
1:检查系统中锁的简单脚本:
Select s.username, s.sid, l.type, l.id1, l.id2, l.lmode, l.request, p.spid PID
From v$lock l, v$session s, v$process p
Where s.sid = l.sid And p.addr = s.paddr And s.username is not null
Order By id1, s.sid,request;
获取用户SID,PID,锁的种类,锁的类型等信息
2:获取数据库锁的信息(用户ID,OBJECT,SQL)
REM *****************************************************************
REM TITLE : Generic Script which displays SQL Text, REM SID
and Object name of the locks currently REM being held in the database.
REM MODULE : lock_held.sql
Set pagesize 60
Set linesize 132
select s.username username, a.sid sid, a.owner||'.'||a.object object, s.lockwait, t.sql_text SQL
from v$sqltext t, v$session s, v$access a
where t.address = s.sql_address and t.hash_value = s.sql_hash_value
and s.sid = a.sid and a.owner != 'SYS'
and upper(substr(a.object,1,2)) != 'V$' ;
REM REM End of "Lock Monitoring Script" REM
3:产生等待锁的用户报告
SELECT sn.username,m.sid, m.type, DECODE(m.lmode, 0, 'None', 1, 'Null', 2, 'Row Share',
3, 'Row Excl.', 4, 'Share', 5, 'S/Row Excl.', 6, 'Exclusive', lmode,
ltrim(to_char(lmode,'990'))) lmode,
DECODE(m.request, 0, 'None', 1, 'Null', 2, 'Row Share', 3, 'Row Excl.', 4, 'Share',
5, 'S/Row Excl.', 6, 'Exclusive', request, ltrim(to_char(m.request,'990'))) request,
m.id1, m.id2
FROM v$session sn, v$lock m |
WHERE (sn.sid = m.sid AND m.request != 0)
OR ( sn.sid = m.sid AND m.request = 0 AND lmode != 4 AND (id1, id2) IN (SELECT s.id1, s.id2
FROM v$lock s
WHERE request != 0 AND s.id1 = m.id1 AND s.id2 = m.id2) )
ORDER BY id1, id2, m.request;
4:显示持有锁的信息:
select nvl(S.USERNAME,'Internal') username, nvl(S.TERMINAL,'None') terminal, L.SID||','||S.SERIAL# Kill,
U1.NAME||'.'||substr(T1.NAME,1,20) tab,
decode(L.LMODE, 1,'No Lock', 2,'Row Share', 3,'Row Exclusive', 4,'Share',
5,'Share Row Exclusive', 6,'Exclusive',null) lmode,
decode(L.REQUEST,1,'No Lock', 2,'Row Share', 3,'Row Exclusive', 4,'Share',
5,'Share Row Exclusive', 6,'Exclusive',null) request
from V$LOCK L, V$SESSION S, SYS.USER$ U1, SYS.OBJ$ T1
where L.SID = S.SID and T1.OBJ# = decode(L.ID2,0,L.ID1,L.ID2) and U1.USER# = T1.OWNER# and S.TYPE != 'BACKGROUND'
order by 1,2,5