`
liuc121
  • 浏览: 6208 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

oracle锁学习小记

 
阅读更多

好久没写博客了,使用了印象笔记之后,就没在这里写过,今天整理笔记发现关于oracle锁的问题,和大家一起分享。

我觉得如果不是DBA,只是普通的程序猿,知道查询锁,然后解锁就行了,关于原理啊一大堆理论,Who Care ! 以下是我一个前辈给我的查询,解锁语句,挺好用在此分享:

 

select t2.username,   
       t2.sid,   
       t2.serial#,   
       t3.object_name,   
       t2.OSUSER,   
       t2.MACHINE,   
       t2.PROGRAM,   
       t2.LOGON_TIME,   
       t2.COMMAND,   
       t2.LOCKWAIT,   
       t2.SADDR,   
       t2.PADDR,   
       t2.TADDR,   
       t2.SQL_ADDRESS,   
       t1.LOCKED_MODE,
       'alter system kill session '''||t2.SID||','||t2.serial#||''';'
  from v$locked_object t1, v$session t2, user_objects t3   
 where t1.session_id = t2.sid   
   and t1.object_id = t3.object_id  order by t2.logon_time;
--查询出来的结果,copy出最后一列,然后执行即可

  

 

下边是不知从哪copy来的 一堆理论,稍微了解一下还是蛮有用的。

在数据库中有两种基本的锁类型:

排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改;加了共享锁的数据对象可以被其他事务读取,但不能修改。

根据保护对象的不同,Oracle数据库锁可以分为以下几大类:

(1) DML lock(data locks,数据锁):用于保护数据的完整性;

(2) DDL lock(dictionary locks,字典锁):用于保护数据库对象的结构(例如表、视图、索引的结构定义);

(3) Internal locks 和latches(内部锁与闩):保护内部数据库结构;

(4) Distributed locks(分布式锁):用于OPS(并行服务器)中;

(5) PCM locks(并行高速缓存管理锁):用于OPS(并行服务器)中。

       

 1)DML锁:

        在Oracle中最主要的锁是DML(也可称为data locks,数据锁)锁。DML锁的目的在于保证并发情况下的数据完整性。在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。

        当Oracle执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标 志位进行置位。这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。TM锁包括了 RS、RX、S、X 等多种模式,在数据库中用0-6来表示。不同的SQL操作产生不同类型的TM锁。

模式 描述 解释 SQL操作
0 none    
1 Null   select
2 RS(Row-S) 行级共享锁,其他对象只能查询被锁数据 select for update、lock for update、lock table in row share mode
3 RX(Row-X) 行级排它锁,在提交之前不允许做DML操作 insert、update、delete、lock table in row exclusive mode
4 S(Share) 共享锁 lock table in share mode
5 SRX(S/Row-X) 共享行级排它锁 lock table in share row exclusive mode
6 X 排它锁 lock table in exclusive mode

        ①row lock (TX锁)行级锁,主要用来防止两个事务对同一行的同时修改。TX锁用作为一种排队机制,使得其他会话来等待这个事务执行。行级别上只有这一种锁,当行上有这个锁时,就永远不会在有第二个这个锁。但是一个表上可以在多行上有多个这种锁。如果要在表上的某一行加这个tx锁,那么一定要在这个表上加一个表级锁。

      ②table lock(TM锁) 表 级锁,当有DML操作insert,update,delete,select……for update,lock table时,将在表上加上TM锁,DML操作需要加上表级锁有两个目的:1)为该事务保留对该表的DML操作权限 2)防止有ddl操作改变表的结构。TM锁可以排斥DDL锁(DDL锁中的一种共享ddl锁可以与TM锁共存,但大多数DDL操作并不会用这种锁),这样 DDL操作就无法进行(下面会讲到DDL锁)。但不会影响DML操作。

 

 

2)DDL锁:

在DDL操作中会自动为对象加DDL锁,从而保护这些对象不会被其他会话锁修改。例如,如果我执行了一个DDL操作 alter table t,表T上就会加一个排他DDL锁,这个排他DDL锁会防止其他会话得到这个表上的DDL锁和TM锁。

有三种类型的DDL锁

       1.排他DDL锁(Exclusive DDL lock):这会防止其他会话得到它们自己的DDL锁或TM(DML)锁。这也表明了,在加上这种类型的DDL锁后,DDL操作期间可以查询一个表,但是无法以任何方式修改这个表的结构和数据。

       2.共享DDL锁(Share DDL lock):这些锁会保护锁引用对象的结构,使之不被其他会话修改,但是允许修改数据。

       3. 可中断解析锁(Share DDL lock):这些锁允许一个对象(如共享池中缓存的一个查询计划)像另外某个对象注册依赖性。如果在被依赖的对象上执行DDL,ORACEL会查看已经对 该对象注册了依赖性的对象列表,并使这些对象无效。因此,这些所是“可中断的”,它们不能防止DDL出现。举个例子:你的会话解析一条语句时,对于该语句 引用的每一个对象都会加一个解析锁。加这些锁的目的是:如果以某种方式删除或修改了一个被引用的对象,可以将共享池中已解析的缓存语句置为无效(刷新输 出)。

大多数DDL带有一个排他DDL锁。

 

 

3)关于后三种锁: Internal locks 和latches(内部锁与闩); Distributed locks(分布式锁);PCM locks(并行高速缓存管理锁),我这里也不清楚,目前也没有相关资料。

 

当数据库发生锁事件之后,我们需要一下SQL查看和解决不必要的锁:

1.相关视图说明

视图名

描述

主要字段说明

v$session

查询会话的信息和锁的信息。

sid,serial#:表示会话信息。

program:表示会话的应用程序信息。

row_wait_obj#:表示等待的对象,和dba_objects中的object_id相对应。

lockwait :该会话等待的锁的地址,与v$lock的kaddr对应.

v$session_wait

查询等待的会话信息。

sid:表示持有锁的会话信息。

Seconds_in_wait:表示等待持续的时间信息

Event:表示会话等待的事件,锁等于enqueue

     

dba_locks

对v$lock的格式化视图。

Session_id:和v$lock中的Sid对应。

Lock_type:和v$lock中的type对应。

Lock_ID1: 和v$lock中的ID1对应。

Mode_held,mode_requested:和v$lock中

的lmode,request相对应。

v$locked_object

只包含DML的锁信息,包括回滚段和会话信息。

Xidusn,xidslot,xidsqn:表示回滚段信息。和

v$transaction相关联。

Object_id:表示被锁对象标识。

Session_id:表示持有锁的会话信息。

Locked_mode:表示会话等待的锁模式的信

息,和v$lock中的lmode一致。

 

2.相关查询语句

--查询数据库中的锁
select * from v$lock;
select * from v$lock where block=1;

--查询被锁的对象
select * from v$locked_object;

--查被阻塞的会话
select * from v$lock where lmode=0 and type in ('TM','TX');

--查阻塞别的会话锁
select * from v$lock where lmode>0 and type in ('TM','TX');

--查询数据库正在等待锁的进程
select * from v$session where lockwait is not null;

--查询会话之间锁等待的关系
select a.sid holdsid, b.sid waitsid, a.type, a.id1, a.id2, a.ctime
  from v$lock a, v$lock b
 where a.id1 = b.id1
   and a.id2 = b.id2
   and a.block = 1
   and b.block = 0;

--查询锁等待事件
select * from v$session_wait where event='enqueue';

查找锁住的表和解锁
select b.owner       TABLEOWNER,
       b.object_name TABLENAME,
       c.OSUSER      LOCKBY,
       c.USERNAME    LOGINID,
       c.sid         SID,
       c.SERIAL#     SERIAL
  from v$locked_object a, dba_objects b, v$session c
 where b.object_id = a.object_id
   AND a.SESSION_ID = c.sid;

--通过SID, SERIAL解锁 
--alter system kill session 'SID, SERIAL';

 

 

 

 

 

 

  • 大小: 93.1 KB
分享到:
评论

相关推荐

    oracle锁表处理

    Oracle数据库操作中,我们有时会用到锁表查询以及解锁和kill进程等操作,那么这些操作是怎么实现的呢?

    Oracle的锁表与解锁

    ### Oracle的锁表与解锁:深入理解与操作 在Oracle数据库管理中,锁是一个至关重要的概念,用于控制多个用户或进程对数据的并发访问,确保数据的一致性和完整性。锁可以分为行级锁(Row Level Lock)和表级锁...

    oracle锁机制探讨

    在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁(用来保证表的结构不被用户修改),TX锁称为事务锁或行级锁。当Oracle执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后,系统...

    oracle解锁,死锁

    在深入讨论Oracle解锁和死锁之前,我们首先需要了解Oracle数据库中的锁机制。 1. **共享锁(S)**:允许多个用户读取行,但不允许修改。 2. **排他锁(X)**:允许单个用户修改行,其他用户只能等待。 3. **共享更新锁...

    oracle锁表和解锁语句示例.sql

    oracle锁表和解锁语句示例。

    Oracle 锁机制问题详解

    ### Oracle 锁机制问题详解 #### 一、引言 在多用户数据库环境中,当多个用户尝试同时访问或修改同一份数据时,就需要通过锁机制来确保数据的一致性和完整性。Oracle 数据库提供了多种类型的锁来支持事务隔离级别,...

    oracle锁表及解锁

    ### Oracle锁表与解锁详解 在Oracle数据库管理中,锁是一种关键机制,用于控制多个用户对数据资源的并发访问,防止数据冲突和不一致。本文将深入探讨Oracle中检查锁表的方法以及如何对表进行解锁。 #### Oracle锁...

    oracle锁表sql

    oracle 查看锁表sql 及如何解锁,多给点分,为了下载别的资料。大家相互学习相互进步

    Oracle数据库的锁类型

    ### Oracle数据库的锁类型详解 #### 一、引言 Oracle数据库作为企业级数据库解决方案的佼佼者,其锁机制是保障数据完整性和并发控制的关键技术之一。在Oracle数据库中,锁的使用是为了协调多个用户对同一数据资源...

    数据库锁学习文档

    在Oracle数据库中,锁进一步细分为DML锁(数据锁)和DDL锁(字典锁)。DML锁用于确保数据完整性,而DDL锁则用于保护数据库对象的结构。此外,还有内部锁,主要用于数据库内部结构的保护,例如Latch,这是一种轻量级...

    Oracle锁 图例

    1. 表级锁:Oracle中的表级锁主要有两种,即排他锁(Exclusive Locks, X locks)和共享锁(Shared Locks, S locks)。排他锁允许一个用户修改表中的数据,而共享锁则允许多个用户同时读取表,但不允许任何写操作。 ...

    查看Oracle锁表

    ### 查看Oracle锁表 在Oracle数据库管理过程中,锁定机制是一项重要的功能,它用于确保数据的一致性和事务处理的安全性。当多个用户试图同时访问同一数据时,可能会出现并发问题,这时就需要通过锁定来控制对数据的...

    快速查找oracle锁对象

    在Oracle数据库管理中,...通过深入学习Oracle的锁机制和监控工具,数据库管理员可以更有效地管理锁,提高系统的稳定性和性能。同时,定期审查和调整数据库的锁策略,能够帮助企业避免因锁问题导致的生产环境故障。

    oracle锁表后,如何解锁

    Oracle锁表后如何解锁 Oracle锁表是指在Oracle数据库中某个表被锁定,无法进行操作的情况。这种情况经常发生在多用户同时访问同一个表时,某个用户锁定了该表,导致其他用户无法访问该表。那么,在不知道谁锁的情况...

    oracle锁库解锁方法

    针对oracle数据库 解锁方法 ,个人使用 希望大家能够有所帮助

    Oracle锁和表分区

    Oracle数据库系统中,锁和表分区是两个关键的管理数据并发和优化性能的机制。首先,我们来深入了解锁的概念。 1. **锁定机制**:锁定是数据库管理系统中用于控制并发访问的一种方法,确保多用户环境下的数据完整性...

Global site tag (gtag.js) - Google Analytics