2013-12-4
一、概述
1.常规操作什么时候会锁表:
UPDATE
DELETE
INSERT
SELECT FOR UPDATE
有时候ORACLE数据的某些表由于频繁操作,而且比较大,也会导致锁表。
2.锁表的表现
(1)、对表进行操作时报如下错误:
(2)、对标进行操作长时间未响应。
二、查询锁表语句
SELECT object_name, machine, s.sid, s.serial#
--若要查询某张表,需在where条件里加o.object_name='tablename'.
三、如何解锁
--通过kill掉进程中的会话来进行解锁
alter system kill session 'sid, serial#';
--kill掉锁表会话后,对方就断开了登录,无法继续进行之前的操作,也无法进行提交和回滚等操作。
四、锁表相关知识
1.查询锁表会用到的视图和表:
2.各个表的重要字段
ID1,ID2:
3.常用联接方式
--查询被锁对象拥有者,对象名,会话id和锁的模式。
select b.owner,b.object_name,a.session_id,a.locked_mode
--查询登录用户,会话id,序列号以及登录时间,并以登录时间排序。
selectb.username,b.sid,b.serial#,logon_time
--查出锁定表的会话的sid, serial#,os_user_name,machine_name和执行的语句
SELECT l.session_id sid, s.serial#, l.locked_mode,l.oracle_username, s.user#,
l.os_user_name,s.machine, s.terminal,a.sql_text, a.action
FROM v$sqlarea a,v$session s, v$locked_object l
WHERE l.session_id = s.sid
AND s.prev_sql_addr = a.address
ORDER BY sid, s.serial#;
附:ORACLE里锁的几种模式:
0:none
1:null 空
2:Row-S 行共享(RS):共享表锁,sub share
3:Row-X 行独占(RX):用于行的修改,subexclusive
4:Share 共享锁(S):阻止其他DML操作,share
5:S/Row-X共享行独占(SRX):阻止其他事务操作,share/sub exclusive
6:exclusive 独占(X):独立访问使用,exclusive数字越大锁级别越高, 影响的操作越多。
1级锁有: select, 有时会在v$locked_object出现。
2级锁有:Select for update,Lock For Update,Lock Row Share select forupdate当对话使用forupdate子串打开一个游标时,所有返回集中的数据行都将处于行级(Row-X)独占式锁定,其他对象只能查询这些数据行,不能进行update、delete或selectfor update操作。
3级锁有:Insert,Update,Delete,Lock Row Exclusive没有commit之前插入同样的一条记录会没有反应,因为后一个3级的锁会一直等待上一个3级的锁,我们必须释放掉上一个才能继续工作。
4级锁有:Create Index, Lock Sharelocked_mode为2、3、4级锁,不影响DML(insert,delete,update,select)操作,但DDL(alter,drop等)操作会提示ora-00054错误。00054, 00000, "resource busy andacquire with NOWAIT specified"
5级锁有:Lock Share Row Exclusive 具体来讲有主外键约束时update / delete ...;可能会产生4,5的锁。
6级锁有:Alter table, Drop table, Drop Index,Truncate table, LockExclusive