c更新数据更新不成功,有可能是被锁表
查看是否有表被锁
select t2.username 用户名
,t2.sid --session identifier,常用于链接其他列
,t2.serial# --SID有可能会重复,当两个session的SID重复时,SERIAL#用来区别session,某个session是由sid和serial#这两个值确定的
,t3.object_name 对象名字
,t2.OSUSER 客户端操作系统用户名
,t2.MACHINE 客户端machine_name
,t2.PROGRAM 客户端应用程序
,t2.LOGON_TIME
,t2.COMMAND --session正在执行的sql id,1代表create table,3代表select
,t2.LOCKWAIT --可以通过这个字段查询出当前正在等待的锁的相关信息
,t2.SADDR 会话地址
,t2.PADDR --process address,关联v$process的addr字段,通过这个可以查询到进程对应的session
,t2.TADDR --当前的transaction address。可以用来关联v$transaction中的addr字段
,t2.SQL_ADDRESS --session正在执行的sql状态,和v$sql中的address,hash_value,sql_id,child_number对应
,t1.LOCKED_MODE
from v$locked_object t1, v$session t2, dba_objects t3
where t1.session_id = t2.sid
and t1.object_id = t3.object_id
order by t2.logon_time;
解表锁
ALTER SYSTEM
KILL SESSION '1150,1623'--1150 1623 对应的是第一步骤查询的STD、serial# ;
查询是否有死锁
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,dba_objects o
WHERE l.sid = s.sid
AND l.id1 = o.object_id(+)
AND s.username is NOT Null
SELECT S.USERNAME, S.OSUSER, S.SID, S.SERIAL#, P.SPID
FROM V$SESSION S, V$PROCESS P
WHERE S.PADDR = P.ADDR
AND S.USERNAME IS NOT NULL;
其他被锁查询
SELECT object_name, machine, s.sid, s.serial#
FROM gv$locked_object l, dba_objects o, gv$session s
WHERE l.object_id = o.object_id
AND l.session_id = s.sid;
如果利用上面的命令杀死一个进程后,进程状态被置为"killed",但是锁定的资源很长时间没有被释放,那么可以在os一级再杀死相应的进程(线程),首先执行下面的语句获得进程(线程)号:
select spid, oSUSEr, s.program
from v$session s,v$process p
where s.paddr=p.addr and s.sid=24 (24是上面的sid)
CMD管理员权限杀死进程(线程)
在windows(unix也适用)cmd root权限用orakill杀死线程,orakill是oracle提供的一个可执行命令,语法为:
orakill sid thread
其中:
sid:表示要杀死的进程属于的实例名
thread:是要杀掉的系统线程号,即第3步查询出的spid。
例:c:>orakill orcl 12345