2013-12-4
一、概述
1.常规操作什么时候会锁表:
UPDATE 会为WHERE条件部分的行加锁
DELETE 会为WHERE条件部分加锁
INSERT 会INSERT部分加锁。
SELECT FOR UPDATE 会对WHERE条件的行加锁。
有时候ORACLE数据的某些表由于频繁操作,而且比较大,也会导致锁表。
2.锁表的表现
(1)、对表进行操作时报如下错误:
ORA-00054: resource busy and acquire with NOWAIT specified
(2)、对标进行操作长时间未响应。
二、查询锁表语句
SELECT object_name, machine, s.sid, s.serial#
FROM v$locked_object l, dba_objects o, v$session s
WHERE l.object_id = o.object_id
AND l.session_id = s.sid;
--若要查询某张表,需在where条件里加o.object_name='tablename'.
三、如何解锁
--通过kill掉进程中的会话来进行解锁
alter system kill session 'sid, serial#';
--kill掉锁表会话后,对方就断开了登录,无法继续进行之前的操作,也无法进行提交和回滚等操作。
四、锁表相关知识
1.查询锁表会用到的视图和表:
V$LOCK, V$LOCKED_OBJECT, V$SESSION, V$SQLAREA,
V$PROCESS, dba_objects.
2.各个表的重要字段
(1)V$LOCK
sid:
会话SID。
type:
锁类型,TM表示表锁或DML锁,TX表示行锁或事务锁,UL表示用户锁。我们主要关注TX和TM两种型的锁,其它均为系统锁,会很快自动释放,不用关注。
lmode:
会话保持的锁的模式。
0=None;1=Null;2=Row-S (SS,行级共享锁,其他对象只能查询这些数据行);3=Row-X
(SX,行级排它锁,在提交前不允许做DML操作);4=Share(共享锁);5=S/Row-X
(SSX,共享行级排它锁);6=Exclusive(排它锁)
ID1,ID2:
ID1,ID2的取值含义根据type的取值而有所不同
对于TM 锁ID1表示被锁定表的object_id 可以和dba_objects视图关联取得具体表信息,ID2 值为0
对于TX 锁ID1以十进制数值表示该事务所占用的回滚段号和事务槽slot number号,其组形式:
0xRRRRSSSS,RRRR=RBS/UNDO NUMBER,SSSS=SLOT NUMBER
ID2 以十进制数值表示环绕wrap的次数,即事务槽被重用的次数
(2)V$SESSION
sid: 会话SID.通常与v$locked_object关联。
serial#:
会话序列号,sid可能会重复,所以通过sid和serial#共同确定一个会话。
username:
登录oracle用户名。
logon_time:
登录oracle时间。
osuser:
电脑用户名如:Administrator
machine:
电脑机器名如:WORKGROUPPC-201009141057
(3)V$LOCKED_OBJECT
session_id:
会话id。通常与v$session关联。
object_id:
被锁对象标识。通常与dba_objects关联。
oracle_username:
登录oracle用户名。
os_user_name:
电脑用户名如:Administrator
locked_mode:
会话保持的锁的模式。
(4)dba_objects
object_id:
被锁对象标识。通常与v$locked_object关联。
object_name:
被锁对象名。
owner:
被锁对象拥有者。
(5)V$SQLAREA
sql_text: 执行的SQL语句。
(6)V$PROCESS
serial#: 会话序列号。
username:
进程拥有者。
3.常用联接方式
--查询被锁对象拥有者,对象名,会话id和锁的模式。
select b.owner,b.object_name,a.session_id,a.locked_mode
from v$locked_object a,dba_objects b
where b.object_id = a.object_id;
--查询登录用户,会话id,序列号以及登录时间,并以登录时间排序。
select
b.username,b.sid,b.serial#,logon_time
from v$locked_object a,v$session b