关于数据锁定的问题,有一行记录被锁定.如何查找到这条操作锁定的语句?
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!