ORACLE锁的总结

整理了一下ORACLE锁的东西
------------------------------------------------------------------------------------------------------------
v$lock视图的各个列及其说明
ADDR
    RAW(4)
    在内存中锁定的对象的地址

KADDR
    RAW(4)
    在内存中锁的地址

SID
    NUMBER
    保持或申请锁的会话的标识号

TYPE
    VARCHAR2(2)
    锁的类型。
    TX=行锁或事务锁;TM=表锁或DML锁;UL=PL/SQL用户锁

ID1
   NUMBER
   锁的第1标识号。
   如果锁的类型是TM,该值表示将要被锁定的对象的标识号;
   如果锁的类型是TX,该值表示撤销段号码的十进制值

ID2
   NUMBER
   锁的第2标识号。
   如果锁的类型是TM,该值为0;
   如果锁的类型是TX,该值表示交换次数

LMODE
   NUMBER
   会话保持的锁的模式。
   0=None;1=Null;2=Row-S (SS);3=Row-X (SX);
   4=Share;5=S/Row-X (SSX);6=Exclusive

REQUEST
   NUMBER
   会话申请的锁的模式。与LMODE中的模式相同

CTIME
   NUMBER
   以秒为单位的,获得当前锁(或转换成当前锁的模式)以来的时间

BLOCK
   NUMBER
   当前锁是否阻塞另一个锁。
   0=不阻塞;1=阻塞

V$LOCKED_OBJECT视图的各个列及其说明

列名
数据类型
说明

XIDUSN
    NUMBER
    撤销段号码

XIDSLOT
    NUMBER
    被锁定的对象在撤销段中的位置

XIDSQN
    NUMBER
   序列号

OBJECT_ID
    NUMBER
    被锁定的对象的标识号

SESSION_ID
    NUMBER
    会话的标识号

ORACLE_USERNAME
    VARCHAR2(30)
    Oracle用户名

OS_USER_NAME
    VARCHAR2(30)
    操作系统用户名

PROCESS
    VARCHAR2(12)
    操作系统进程标识号

LOCKED_MODE
    NUMBER
    对象被锁定的模式。
    0=None;1=Null;2=Row-S (SS);3=Row-X (SX);
    4=Share;5=S/Row-X (SSX);6=Exclusive

DBA_LOCKS视图的各个列及其说明

列名
数据类型
说明

SESSION_ID
    NUMBER
    保持或申请锁的会话的标识号

LOCK_TYPE
    VARCHAR2(26)
    锁的类型

MODE_HELD
    VARCHAR2(40)
    保持的锁的模式

MODE_REQUESTED
    VARCHAR2(40)
    申请的锁的模式

LOCK_ID1
    VARCHAR2(40)
    锁的第1标识号

LOCK_ID2
    VARCHAR2(40)
    锁的第2标识号

LAST_CONVERT
    NUMBER
    以秒为单位的,获得当前锁(或转换成当前锁的模式)以来的时间

BLOCKING_OTHERS
   VARCHAR2(40)
   当前锁是否阻塞另一个锁。
   Not Blocking=不阻塞;Blocking=阻塞

DBA_WAITERS视图的各个列及其说明

列名
数据类型
说明

WAITING_SESSION
    NUMBER
    等待锁的会话(被阻塞的会话)的标识号

HOLDING_SESSION
    NUMBER
    保持锁的会话(阻塞的会话)的标识号

LOCK_TYPE
    VARCHAR2(26)
    锁的类型

MODE_HELD
    VARCHAR2(40)
    保持的锁的模式

MODE_REQUESTED
    VARCHAR2(40)
    申请的锁的模式

LOCK_ID1
    NUMBER
    锁的第1标识号

LOCK_ID2
    NUMBER
    锁的第2标识号

DBA_BLOCKERS视图的各个列及其说明

列名
数据类型
说明

HOLDING_SESSION
    NUMBER
    显示阻塞了其他会话的那些会话的标识号

-----------------------------------------------------------------------------------------------------
由sys用户通过查询与锁相关的视图来了解锁,了解阻塞会话与被阻塞会话的sid、serial#、用户名及其所使用的DML操作语句。
-----------------------------------------------------------------------------------------------------

set pagesize 40 linesize 150
column blockers format a45
column waiters format a45
select '阻塞者('||sb.sid||':'||sb.serial#||'-'||sb.username||')-'||qb.sql_text blockers,
       '等待者('||sw.sid||':'||sw.serial#||'-'||sw.username||')-'||qw.sql_text waiters
from v$lock lb,v$lock lw,v$session sb,v$session sw,v$sql qb,v$sql qw
where lb.sid=sb.sid
  and lw.sid=sw.sid
  and sb.prev_sql_addr=qb.address
  and sw.sql_address=qw.address
  and lb.id1=lw.id1
  and sb.lockwait is null
  and sw.lockwait is not null
  and lb.block=1;
-------------------------------------------------------------------------------------------------------
要了解哪些数据库用户的会话锁定了对象、锁定的模式是什么、对应的操作系统用户是在哪台计算机上进行操作的、被锁定的对象及其类型等信息
-------------------------------------------------------------------------------------------------------
set pagesize 40 linesize 150
column username format a9
column sid format 9999
column serial# format 99999999
column mode_locked format a12
column os_user_name format a16
column object_name format a12
column object_type format a12
select s.username,s.sid,s.serial#,
     decode(lo.locked_mode,
     0,'none',
     1,'null',
     2,'row-s(ss)',
     3,'row-x(sx)',
     4,'share',
     5,'s/row-x(ssx)',
     6,'exclusive',
     to_char(lo.locked_mode)) mode_locked,
     lo.os_user_name,
     do.object_name,do.object_type
from v$session s,v$locked_object lo,dba_objects do
where
   lo.object_id=do.object_id;
--------------------------------------------------------------------------------------------------------
要了解阻塞者会话的sid、serial#信息
--------------------------------------------------------------------------------------------------------
set pagesize 40 linesize 150
column username format a9
column sid format 9999
column serial# format 99999999
select s.username,s.sid,s.serial#
from v$session s,dba_blockers dbab
where s.sid=dbab.holding_session;

---------------------------------------
解锁      
---------------------------------------
alter system kill session 'sid,serial#';

时间: 2024-10-26 21:17:52

ORACLE锁的总结的相关文章

ORACLE锁的管理

oracle (转载自:http://fengyu.china.com/lock.htm)ORACLE锁的管理 2003-03 余枫ORACLE里锁有以下几种模式:0:none1:null 空2:Row-S 行共享(RS):共享表锁 3:Row-X 行专用(RX):用于行的修改4:Share 共享锁(S):阻止其他DML操作5:S/Row-X 共享行专用(SRX):阻止其他事务操作6:exclusive 专用(X):独立访问使用数字越大锁级别越高, 影响的操作越多.一般的查询语句如select

ORACLE 锁

oracle ORACLE数据库是现今数据库领域应用最广泛的,同时它也是一个庞大的系统,全面了解它.玩转它不但需要一定的理论知识,更需要开发经验与工程经验.本人是ORACLE一爱好者,以下是本人对ORACLE锁的一些经验,希望能与大家共同分享. ORACLE锁具体分为以下几类: 1.按用户与系统划分,可以分为自动锁与显示锁 自动锁:当进行一项数据库操作时,缺省情况下,系统自动为此数据库操作获得所有有必要的锁. 显示锁:某些情况下,需要用户显示的锁定数据库操作要用到的数据,才能使数据库操作执行得更

oracle锁

  Oracle中避免排队的唯一方式是使用SELECT ... FOR UPDATE(子句WAIT/NOWAIT)命令. oracle锁的排队机制: 请求锁定需要排队.如果某个会话请求一个锁定,但是由于其他会话已经锁定了指定记录或对象而无法获得所需的锁定,那么这个会话将会等待. 此时,可能多个会话都在等待访问相同记录或对象,在这种情况下,ORACLE会跟踪这些会话请求锁定的顺序. 如果不希望某个会话在无法获得锁定时进行排队等候,那么避免排队的唯一方式是使用SELECT ... FOR UPD

ORACLE锁机制深入理解_oracle

数据库是一个多用户使用的共享资源.当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性. 加锁是实现数据库并发控制的一个非常重要的技术.当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁.加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作. 在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Lo

【锁】Oracle锁系列

[锁]Oracle锁系列 1  BLOG文档结构图           2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 锁的概念.分类.及其模拟 ② 查询锁的视图及视图之间的关联 ③ 锁的参数(DML_LOCKS.DDL_LOCK_TIMEOUT) ④ FOR UPDATE及FOR UPDATE OF系列 ⑤ 带ONLINE和不带ONLINE创建索引的锁情况(是否阻塞DML操作) ⑥ 包或存

Oracle 锁表解决方法

--查看被锁对象 select a.session_id,a.object_id,a.oracle_username,b.object_type,b.object_name from v$locked_object a,all_objects b where a.object_id = b.object_id; --解锁办法 1)查到sid.serial# select c.sid,c.serial# from v$session c where c.sid in(select a.sessio

Oracle锁(Lock)的探讨

1.锁(Lock)的原则 Oracle当中的锁通常是业务层面的问题,锁是为了在并发的 情况下保证数据库的一致性,因此没有并发就没有锁.Oracle的锁有如下几个原则: 只有被修改时,行才会被锁定,因为有UNDO的关系,读不会产生行锁. 当一条语句修改了一条记录,只有这条记录上被锁定,在Oracle数据库中不存在锁升级. 当某行被修改时,它将阻塞别人对它的修改. 当一个事务修改一行时,将在这个行上加上行锁(TX),用于阻止其它事务对相同行的修 改. 读永远不会阻止写,但唯一的例外,就是select

理解oracle锁和闩(3)TX锁和TM锁

oracle没有锁管理器和锁列表,这样可以避免行级锁维护的开销和行级锁数量不足导致的争用问题.在Oracle的每行数据上,都有一个标志位来表示该行数据是否被锁定,要查看某一行是否被锁定,必须直接找到这一行,而不要指望能从哪个列表得到答案,事务只是找到数据.其locking过程如下: ㈠ 找到想锁定的那一行的地址 ㈡ 到达那一行 ㈢ 锁定这一行 在这行的位置,而非某个锁列表.如果这一行已经锁定,则等待锁定它的事务结束,除非使用nowait选项. 保护元数据---->TM锁(表级锁) 保护数据 --

理解oracle锁和闩(2)锁机制概述

锁(lock)是一种防止多个事务访问同一资源时产生破坏性的相互影响的机制.通常,高并发数据库需要利用锁机制解决数据并发访问.一致性及完整性问题. 前面提到的资源(resource)大致可以分为两类: ● 用户对象:例如表及数据行 ● 对用户透明的系统对象:例如内存中的共享数据结构.数据字典中的信息 任何 SQL 语句执行时 Oracle 都隐式地对 SQL 所需的锁进行管理,因此用户无需显式地对资源加锁.Oracle 默认采用的锁机制能尽可能地减小对数据访问的限制,在保证数据一致性的同时实现高度