日期:2014-05-17  浏览次数:20920 次

关于数据锁定的问题,有一行记录被锁定.如何查找到这条操作锁定的语句?
JSP 操作数据库时有时会锁定一条记录,在PLSQL查询得到锁定哪个表哪行记录,不知道能不能查询得到是哪条语句锁定了这行数据?或者有其它什么更好的法子,去解决这个问题?

------解决方案--------------------
-- 查出被锁的表,和锁住这个表的会话ID
select a.session_id ,b.* from v$locked_object a,all_objects b
where a.object_id=b.object_id

-- 查出对应的SQL语句
select vs.SQL_TEXT,vsess.sid,vsess.SERIAL#,vsess.MACHINE,vsess.OSUSER
,vsess.TERMINAL,vsess.PROGRAM,vs.CPU_TIME,vs.DISK_READS
from v$sql vs,v$session vsess
where vs.ADDRESS=vsess.SQL_ADDRESS
and vsess.sid=(上面查出来的会话ID)

------解决方案--------------------
查询那些用户,操纵了那些表造成了锁机 
SELECT s.username, 
decode(l.type,'TM','TABLE LOCK', 
'TX','ROW LOCK', 
NULL) LOCK_LEVEL, 
o.owner,o.object_name,o.object_type, 
s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser 
FROM v$session s,v$lock l,all_objects o 
WHERE l.sid = s.sid 
AND l.id1 = o.object_id(+) 
AND s.username is NOT Null 



up
------解决方案--------------------
1.查哪个过程被锁

查V$DB_OBJECT_CACHE视图:

SELECT * FROM V$DB_OBJECT_CACHE WHERE OWNER='过程的所属用户' AND LOCKS!='0';



2. 查是哪一个SID,通过SID可知道是哪个SESSION.

查V$ACCESS视图:

SELECT * FROM V$ACCESS WHERE OWNER='过程的所属用户' AND NAME='刚才查到的过程名';



3. 查出SID和SERIAL#

查V$SESSION视图:

SELECT SID,SERIAL#,PADDR FROM V$SESSION WHERE SID='刚才查到的SID'



查V$PROCESS视图:

SELECT SPID FROM V$PROCESS WHERE ADDR='刚才查到的PADDR';



4. 杀进程

(1).先杀ORACLE进程:

ALTER SYSTEM KILL SESSION '查出的SID,查出的SERIAL#';



(2).再杀操作系统进程:

KILL -9 刚才查出的SPID



ORAKILL 刚才查出的SID 刚才查出的SPID


------解决方案--------------------
锁表解除查询:
select s.sid,
s.serial#,
do.object_name,
l.oracle_username,
s.machine,
l.os_user_name,
l.locked_mode
from v$locked_object l, dba_objects do, v$session s
 where do.object_id = l.object_id
and s.sid = l.session_id;

接着:
alter system kill session 'sid,#serial';

OK!