`
jake0719
  • 浏览: 90405 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

oracle中锁的问题

阅读更多

 

前两天同事又碰到oracle连接n慢的问题,由于这个现象时有时无,于是我检查了下是不是表或者其他对象有被锁住,或者是否有死锁。对象资源被锁是一个经常要碰到的急需解决的问题。

 

在Oracle里,当前的锁的信息存储在动态性能视图v$lock和v$locked_object中。先来看下它们定义:

 

Oracle官方文档及简单翻译 (oracle官方可下载资源网址在我的收藏里有列出):

V$LOCK

V$LOCK lists the locks currently held by the Oracle Database and outstanding requests for a lock or latch.

视图V$LOCK列出了当前被Oracle数据库持有的所有的锁以及未完成的锁和栓锁请求。

Column Datatype Description
ADDR RAW(4 | 8) Address of lock state object/内存中被锁的对象的地址
KADDR RAW(4 | 8) Address of lock/内存中锁地址
SID NUMBER Identifier for session holding or acquiring the lock/持有或申请锁的会话标识号
TYPE VARCHAR2(2) Type of user or system lock/系统锁或者用户锁类型

The locks on the user types are obtained by user applications. Any process that is blocking others is likely to be holding one of these locks. The user type locks are:

TM - DML enqueue/表级锁或DML锁

TX - Transaction enqueue/行级锁或事务锁

UL - User supplied/用户锁

The locks on the system types are held for extremely short periods of time. The system type locks are listed in Table 8-1 .

 

ID1 NUMBER

Lock identifier #1 (depends on type)

锁的第1标识号

如果锁的类型是TM,该值表示将要被锁定的对象的标识号;

如果锁的类型是TX,该值表示撤销段号码的十进制值

ID2 NUMBER

Lock identifier #2 (depends on type)

锁的第2标识号。

如果锁的类型是TM,该值为0;

如果锁的类型是TX,该值表示交换次数

LMODE NUMBER

Lock mode in which the session holds the lock:

会话保持的锁的模式

  • 0 - none

  • 1 - null (NULL) 空

  • 2 - row-S (SS) 行共用(RS):共用表锁,sub share

  • 3 - row-X (SX)  行独占(RX):用于行的修改,sub exclusive


  • 4 - share (S) 共用锁(S):阻止其他DML操作,share

  • 5 - S/Row-X (SSX) 共用行独占(SRX):阻止其他事务操作,share/sub exclusive

  • 6 - exclusive (X) 独占(X):独立访问使用,exclusive

锁的级别越高影响的操作越多。
REQUEST NUMBER

Lock mode in which the process requests the lock:

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

  • 0 - none

  • 1 - null (NULL)

  • 2 - row-S (SS)

  • 3 - row-X (SX)

  • 4 - share (S)

  • 5 - S/Row-X (SSX)

  • 6 - exclusive (X)

CTIME NUMBER

Time since current mode was granted

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

BLOCK NUMBER

A value of either 0 or 1, depending on whether or not the lock in question is the blocker.

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

V$LOCKED_OBJECT

V$LOCKED_OBJECT lists all locks acquired by every transaction on the system. It shows which sessions are holding DML locks (that is, TM-type enqueues) on what objects and in what mode.

视图V$LOCKED_OBJECT列出系统中每个事务获得的所有锁。它列出了那些以具体哪些模式对具体哪些对象持有TM锁的会话。

Column Datatype Description
XIDUSN NUMBER Undo segment number/撤销段号码
XIDSLOT NUMBER Slot number/被锁定的对象在撤销段中的位置
XIDSQN NUMBER Sequence number/序列号
OBJECT_ID NUMBER Object ID being locked/被锁定的对象的标识号
SESSION_ID NUMBER Session ID/ 会话的标识号
ORACLE_USERNAME VARCHAR2(30) Oracle user name/Oracle用户名
OS_USER_NAME VARCHAR2(30) OS user name/操作系统用户名
PROCESS VARCHAR2(12) OS process ID/操作系统进程标识号
LOCKED_MODE NUMBER Lock mode/

对象被锁定的模式。

0=None;1=Null;2=Row-S (SS);3=Row-X (SX);

4=Share;5=S/Row-X (SSX);6=Exclusive

 

查找有关锁/死锁的更多我们需要的信息有时还需要通过表all_objects或者视图v$session,它们就不再一一讲解,请到oracle官方文档 查询。

 

查询有关锁的信息:

 

查询一:

 select a.os_user_name,
         a.oracle_username,
          a.object_id,
          c.object_name,
       c.object_type
    from v$locked_object a, dba_objects c
    where a.object_id=c.object_id;

 

查询二:

 

select s.PROCESS,
       s.SID,
       s.SERIAL#,
       b.object_name,
       b.subobject_name,
       a.LOCKED_MODE,
       s.OSUSER,
       s.LOGON_TIME,
       s.MACHINE,
       s.PROGRAM,
       s.SQL_ADDRESS,
       s.SQL_HASH_VALUE           
  from v$locked_object a, dba_objects b, v$session s
where a.OBJECT_ID = b.object_id
   and a.SESSION_ID = s.SID

 

找到锁/死锁就好办了。找到相应需要解开的锁可以通过完成该事务或者杀死会话解锁。

 

杀锁进程可以用以下命令:

alter system kill session ' '查出的SID,查出的SERIAL#'。(这个必须要用查询二来获得相关Session信息)

 

杀oracle会话进程有时会失效,需要根据SPID到系统中杀相应的oracle进程。另外要注意的是, 我看到网上有外国的学者说, 当直接连接数据库时, 直接用OS命令 $kill process_num 或者 $kill -9 process_num杀系统进程来终止用户连接也不能完全解决问题, 因为一个用户进程可能产生一个以上的锁,杀oracle进程不能彻底解决锁的问题。

 

Reference:

http://www.lslnet.com/linux/edosc/42/linux-42294950.htm

分享到:
评论

相关推荐

    Oracle的锁表与解锁

    本文将深入探讨Oracle中的锁机制,特别是如何锁表与解锁,以及相关的SQL查询语句,帮助数据库管理员和开发人员更好地理解和管理Oracle数据库的锁状态。 #### 锁的类型 在Oracle中,锁主要分为两种类型: 1. **TX...

    Oracle 锁机制问题详解

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

    oracle数据库锁使用

    在Oracle中,锁主要分为两类:数据锁(DML锁)和字典锁。字典锁主要用于内部管理,特别是语法分析和DDL操作,用户无法直接控制。而数据锁则是我们关注的重点,它们涉及到实际的数据操作,包括对数据的读取和修改。 ...

    Oracle数据库解锁工具

    Oracle数据库解锁工具是一种专门用于解决Oracle数据库账户锁定问题的应用程序,尤其在开发环境中十分有用。在Oracle数据库系统中,为了确保安全性,用户账户可能会因为多次尝试登录失败而被自动锁定。这种情况下,...

    oracle锁表处理

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

    ORACLE数据库锁表问题浅析.pdf

    ORACLE数据库锁表问题浅析 Oracle数据库锁机制是企业级数据库管理系统中一个非常重要的机制。锁机制的主要目的是为了保证数据的一致性和正确性,在多用户同时访问数据库时,避免数据的不一致和错误。Oracle数据库锁...

    oracle存储过程解锁

    在IT领域,尤其是在数据库管理与优化中,存储过程的解锁是一项关键技能,尤其对于Oracle数据库而言。当存储过程被锁定时,可能会影响系统的性能和稳定性,因此掌握如何解锁存储过程至关重要。以下是对“oracle存储...

    Oracle数据库的锁类型

    本文将深入探讨Oracle数据库中的锁类型,尤其是DML锁,以及它们是如何在并发环境中维护数据完整性的。 #### 二、Oracle数据库锁类型概览 Oracle数据库的锁类型大致可以分为三类:DML锁、DDL锁和内部锁与闩锁。DML...

    oracle解锁,死锁

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

    Oracle强制释放锁的命令

    Oracle 强制释放锁命令 在 Oracle 中,当出现 ORA-00054 错误时,通常是由于资源忙碌,无法获取资源而导致的。在这种情况下,可以使用强制释放锁的命令来释放锁资源,解决问题。 一、什么是 ORA-00054 错误? ORA...

    Oracle的锁机制

    Oracle的锁机制是数据库管理系统中一个关键的组成部分,它的主要目标是确保在多用户环境下,数据的读一致性、完整性和并行性。Oracle提供了多种类型的锁来满足这些需求。 首先,按照是否独占,锁分为排它锁(X锁)...

    oracle中锁和表分区

    在Oracle中,锁是数据库管理系统用于控制共享资源并发访问的一种机制。它们的主要目标是防止数据的不一致性,并确保事务的隔离性。锁分为不同级别,包括行级锁和表级锁。行级锁锁定的是单个数据行,允许其他用户同时...

    oracle锁机制探讨

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

    对于Oracle锁的一些理论总结

    在Oracle中,锁分为三类:DML锁(用于保护数据完整性)、DDL锁(保护数据库对象结构)以及内部锁和Latch(保护数据库内部结构)。DML锁是本文的重点,它包括行级锁(row level lock)和表级锁(table level lock)。...

    oracle锁表及解锁

    Oracle中的锁主要有两种类型:表级锁(Table Locks)和行级锁(Row Locks),分别由`TM`和`TX`标识。表级锁通常用于DML操作或DDL操作,而行级锁则是在执行更新、插入或删除等操作时自动产生的。 #### 检查锁定情况 ...

    Oracle锁表处理,Oracle表解锁

    数据库死锁的概念, 所谓死锁,是指两个会话,每个会话都持有另外一个会话想要的资源,因争夺资源而造成...对于锁死的会话,我们可以直接删掉该会话,等事物回滚完成,也可以找出锁死进程的spid,从服务器中删掉该进程。

Global site tag (gtag.js) - Google Analytics