ITPub博客

首页 > 数据库 > Oracle > 【原创】oracle 锁表问题

【原创】oracle 锁表问题

Oracle 作者:13907486733 时间:2013-12-07 19:04:25 0 删除 编辑

2013-12-4
一、概述
通例操做甚么时候会锁表:
UPDATE   会为WHERE条件部分的行减锁
DELETE   会为WHERE条件部分减锁
INSERT   会INSERT部分减锁。
SELECT FOR UPDATE  会对WHERE条件的行减锁。
有时候ORACLE数据的某些表因为频仍操做,并且对比大,也会招致锁表。


两、查询锁表语句
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#";


4、锁表相关常识
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(排它锁)
 (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
            where a.session_id = b.sid order by b.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):用于行的点窜,sub exclusive
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 for update当对话行使for update子串打开一个游标时,所有返回集中的数据行都将处于行级(Row-X)独占式锁定,其他对象只能查询那些数据行,不克不及停止update、delete或select for update操做。
3级锁有:Insert,Update,Delete,Lock Row Exclusive 没有commit之前插进一样的一条记载会没有回响反应, 因为后一个3级的锁会不断期待上一个3级的锁,我们必须开释失落上一个才华继尽工做。
4级锁有:Create Index, Lock Share locked_mode为2、3、4级锁,不影响DML(insert,delete,update,select)操做, 但DDL(alter,drop等)操做会提示ora-00054错误。00054, 00000, "resource busy and acquire with NOWAIT specified"
5级锁有:Lock Share Row Exclusive 具体来讲有主中键约束时update / delete ... ; 概略会产死4,5的锁。
6级锁有:Alter table, Drop table, Drop Index,Truncate table, Lock Exclusive


<!-- 正文结束 -->

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22390534/viewspace-1115546/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2009-08-21