oracle锁管理详解,oracle锁的管理(转)

本文详细探讨了Oracle数据库中的各种锁类型,包括DML、DDL、TM、TX和人工锁定,并提供了实用的SQL查询来监控系统锁状态、锁定信息和等待事件。通过实例和脚本展示了如何查看用户锁定对象、获取锁定SQL及生成等待锁报告,是数据库管理员和开发者不可或缺的参考资料。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值