祝大家新年快乐,有任何问题可与我联系:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yNjFTOkhTMkN2YkF2YxEjY5QDZkZDNxQTNxcTY1YTOw8CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
一、被锁的现象及原因
首先说一下被锁的现象,当你持行一条SQL语句的时候,一直处于等待状态,就感觉没有连接数据库一样,但是持行另外的SQL语句却能够正常持行。
为什么这出现这种情况了?
1、当两个用户同时对一个表执行了DML语句而没有COMMIT时,另一个用户也需要对表进行DML操作;
2、一个用户对表执行DML语句过程中程序中断,此时SQL语句得不到应有的返回;
二、解决方法
1、首先得修改程序的逻辑才能避免下次出现同样的问题;
2、对已经出现的锁进行解锁:
a、查找出锁的SID和SERIAL#
SELECT
lpad(' ', decode(l.xidusn, 0, 3, 0)) || l.oracle_username User_name,
o.owner,
o.object_name,
o.object_type,
s.sid,
s.serial#,
p.spid
FROM
v$locked_object l, dba_objects o, v$session s, v$process p
WHERE
l.object_id = o.object_id AND
l.session_id = s.sid AND
s.paddr = p.addr
ORDER BY
o.object_id, xidusn DESC;
SELECT
lpad(' ', decode(l.xidusn, 0, 3, 0)) || l.oracle_username User_name,
o.owner,
o.object_name,
o.object_type,
s.sid,
s.serial#,
p.spid
FROM
v$locked_object l, dba_objects o, v$session s, v$process p
WHERE
l.object_id = o.object_id and
l.session_id = s.sid and
s.paddr = p.addr
ORDER BY
o.object_id, xidusn DESC;
b、根据上面查出来的SID和SERIAL#,在数据库中结束相关的SESSION
ALTER system KILL SESSION 'sid,serial#';
alter system kill session 'sid,serial#';
c、根据SPID从系统中结束与该SESSION对应的进程
KILL -9 spid;
kill -9 spid;
TIPS:一般我们通过前面两步就可以消除锁了,没有必要持行第三步。
~谢谢打赏~手机请长按图片~
赞 赏