ORA数据库解锁

[b]一.查询锁基本信息:[/b]

select a.object_name, --被锁的资源
dd.*
from (
select a.sid,
'Wait' "Status", --/*+ NO_MERGE(a) NO_MERGE(b) NO_MERGE(c) */ LOCK表明该进程锁住了某个资源,WAIT表示该进程正在等待某个资源
a.username, --ORACLE用户名
a.machine, --ORACLE机器
a.serial#,
a.last_call_et "Time", --表示该进程最后一次进行操作至当前的时间(秒)
a.program, --产生死锁的语句主要来自哪个应用程序
a.command,
a.lockwait, --死锁的状态,如果有内容表示被死锁
b.id1, --锁标识。某个LOCK状态的ID1与某个WAIT状态的ID1相同,可说明锁的正是另一个进程等待的。
c.sql_text "SQL" -- 锁住资源的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
union
select a.sid,
'Lock' "Status", --/*+ NO_MERGE(a) NO_MERGE(b) NO_MERGE(c) */
a.username,
a.machine,
a.serial#,
a.last_call_et "Time",
a.program,
a.command,
a.lockwait,
b.id1,
c.sql_text "SQL"
from v$session a, v$lock b, v$sqltext c
where b.id1 in
(
select distinct e.id1 -- /*+ NO_MERGE(d) NO_MERGE(e) */
from v$session d, v$lock e
where d.lockwait = e.kaddr
)
and a.username is not null
and a.sid = b.sid
and b.request=0
and c.hash_value =a.sql_hash_value
) dd
left join v$locked_object o on dd.sid = o.session_id
left join all_objects a on o.object_id = a.object_id

[b]注:[/b]NO_MERGE()保证视图的查询不被拆散。这是防止CBO在设计执行方案时将Oracle优化过的视图拆分。以保证执行效率。
[b]二.解锁:[/b]

alter system kill session 'sid,serial#';


[b]三.原因分析[/b]

[b]1.由于外键原因导致的表级锁[/b]
当在一个session中对从表进行update,insert或delete操作时,oracle会默认对从表数据施加行级锁,而与此同时,如果在另一个session中对主表进行delete操作,oracle便会寻找所有以主表ID为FK的从表,然后看该从表是否有该外键的索引。如果有,则访问索引,如果没有,则对从表施加表级锁,然后对全表进行扫描。
[b]解决办法:[/b]为从表的外键建立索引,这也是在使用外键时的推荐方式。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值