`

Oracle数据库的锁类型(转)

 
阅读更多

Oracle数据库的锁类型

oracle官方文档里面关于锁的定义:Locks are mechanisms that prevent destructive interaction between transactions accessing the same resource—either user objects such as tables and rows or system objects not visible to users, such as shared data structures in memory and data dictionary rows.

这段话的大概意思是说锁的作用用来保护tables、rows、shared data structures in memory and data dictionary rows等在交互访问的时候不会被破坏。

根据保护的对象不同,Oracle数据库锁可以分为以下几大类:DML锁(data locks,数据锁),用于保护数据的完整性;DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;内部锁和闩(internal locks and latches),保护数据库的内部结构。

DML锁的目的在于保证并发情况下的数据完整性,在Oracle数据库中,DML锁主要包括TM锁TX锁,其中TM锁称为级锁,TX锁称为事务锁或行级锁。

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

在数据行上只有X锁(排他锁)。在 Oracle数据库中,当一个事务首次发起一个DML语句时就获得一个TX锁,该锁保持到事务被提交或回滚。当两个或多个会话在表的同一条记录上执行 DML语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。当第一个会话提交后,TX锁被释放,其他会话才可以加锁。

当Oracle数据库发生TX锁等待时,如果不及时处理常常会引起Oracle数据库挂起,或导致死锁的发生,产生ORA-60的错误。这些现象都会对实际应用产生极大的危害,如长时间未响应,大量事务失败等。

DML锁分类表

表1 Oracle的TM锁类型

锁模式

锁描述

解释

SQL操作

0

none

   

1

NULL

Select

2

SS(Row-S)

行级共享锁,其他对象只能查询这些数据行

Select for update、Lock for update、Lock row share

3

SX(Row-X)

行级排它锁,在提交前不允许做DML操作

Insert、Update、Delete、Lock row share

4

S(Share)

共享锁

Create index、Lock share

5

SSX(S/Row-X)

共享行级排它锁

Lock share row exclusive

6

X(Exclusive)

排它锁

Alter table、Drop able、Drop index、Truncate table 、Lock exclusive

 

 

1.关于V$lock表和相关视图的说明

 

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

TX - Transaction enqueue

UL - User supplied

--我们主要关注TXTM两种类型的锁

--UL锁用户自己定义的,一般很少会定义,基本不用关注

--其它均为系统锁,会很快自动释放,不用关注

ID1

NUMBER

Lock identifier #1 (depends on type)

ID2

NUMBER

Lock identifier #2 (depends on type)

---当lock type 为TM时,id1为DML-locked object的object_id

---当lock type 为TX时,id1为usn+slot,而id2为seq。

--当lock type为其它时,不用关注

LMODE

NUMBER

Lock mode in which the session holds the lock:

0 - none

1 - null (NULL)

2 - row-S (SS)

3 - row-X (SX)

4 - share (S)

5 - S/Row-X (SSX)

6 - exclusive (X)

--大于0时表示当前会话以某种模式占有该锁,等于0时表示当前会话正在等待该锁资 源,即表示该会话被阻塞。

--往往在发生TX锁时,伴随着TM锁,比如一个sid=9会话拥有一个TM锁,一般会拥有一个 或几个TX锁,但他们的id1和id2是不同的,请注意

REQUEST

NUMBER

Lock mode in which the process requests the lock:

0 - none

1 - null (NULL)

2 - row-S (SS)

3 - row-X (SX)

4 - share (S)

5 - S/Row-X (SSX)

6 - exclusive (X)

 

--大于0时,表示当前会话被阻塞,其它会话占有改锁的模式

CTIME

NUMBER

Time since current mode was granted

BLOCK

NUMBER

The lock is blocking another lock

0, 'Not Blocking', /* Not blocking any other processes */
1, 'Blocking', /* This lock blocks other processes */
2, 'Global', /* This lock is global, so we can't tell */

--该锁是否阻塞了另外一个锁

 

2.其它相关视图说明

视图名

描述

主要字段说明

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一致。

 

 

1.查询数据库中的锁

select * from v$lock;
select * from v$lock where block=1;

2.查询被锁的对象

select * from v$locked_object;

3.查询阻塞

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

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

4.查询数据库正在等待锁的进程

select * from v$session where lockwait is not null;

5.查询会话之间锁等待的关系

 

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;

 

6.查询锁等待事件

select * from v$session_wait where event='enqueue';

7.查找锁住的表和解锁

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_idAND a.SESSION_ID =c.sid;
--通过SID, SERIAL解锁
--
alter system kill session 'SID, SERIAL';

分享到:
评论

相关推荐

    Oracle数据库的锁类型

    #### 二、Oracle数据库锁类型概览 Oracle数据库的锁类型大致可以分为三类:DML锁、DDL锁和内部锁与闩锁。DML锁(数据锁)主要用于保护数据的完整性,DDL锁(字典锁)用于保护数据库对象的结构,如表、索引等,而...

    oracle数据库锁使用

    总之,Oracle数据库锁的使用是数据库管理中的重要一环,理解并合理运用这些锁可以帮助我们优化并发性能,防止数据冲突,并确保数据的正确性和一致性。在设计事务和处理并发操作时,应根据业务需求选择合适的锁类型,...

    浅谈ORACLE数据库锁的类型与机制.pdf

    浅谈 Oracle 数据库锁的类型与机制 Oracle 数据库锁是指 Oracle 数据库中用于保护数据的一致性和完整性的机制。 Oracle 数据库锁可以分为五大类:DML 锁、DDL 锁、内部锁、分布式锁和 PCM 锁。 1. DML 锁(Data ...

    Oracle数据库性能分析

    ### Oracle数据库性能分析 #### 一、Oracle体系结构 Oracle数据库是一个复杂且功能强大的关系型数据库管理系统(RDBMS),其核心组件包括实例和数据库文件。理解Oracle的体系结构对于优化性能至关重要。 - **实例**...

    Oracle数据库锁的研究.pdf

    根据不同的分类标准,Oracle数据库中的锁可以分为多种类型: 1. 按照操作分类,主要分为DML锁和DDL锁: - DML锁(Data Manipulation Language Locks):用于数据操作,包括行级锁(TX锁)和表级锁(TM锁)。行级锁...

    oracle数据库锁表处理

    ### Oracle数据库锁表处理 在Oracle数据库管理过程中,锁表是一种常见的现象,它通常发生在多用户并发访问同一数据对象时。锁表会导致其他用户无法访问该数据对象,从而影响系统的正常运行。本文将详细介绍如何处理...

    Oracle数据库学习指南

    Oracle2: 1. 《Oracle8 优化技术》摘录 (第一章 安装) 2. 《Oracle8 优化技术》摘录 (第二章 内存-CPU) 3. 《Oracle8 优化技术》摘录 (第三章 输入-输出) 4. EXP、IMP 命令详解 ...52. 自动备份Oracle数据库

    oracle数据库 详细课件

    Oracle数据库是全球最广泛使用的商业关系型数据库管理系统之一,它由甲骨文公司(Oracle Corporation)开发和维护。本详细课件将引导你逐步了解Oracle数据库的基础知识,为你的入门之旅提供全面指导。 1. **Oracle...

    oracle数据库中的锁机制

    #### Oracle数据库锁的概念 锁是一种用于控制多个用户或进程对共享资源(如表、行或数据库结构)访问的机制。它主要分为两大类:共享锁(Share Locks)和排他锁(Exclusive Locks)。共享锁允许多个用户读取数据,...

    oracle数据库实验报告

    【Oracle数据库实验报告】 在本实验报告中,我们将探讨Oracle数据库的配置、管理和维护过程,主要涉及以下几个关键知识点: 1. **监听程序配置**:Oracle数据库在运行前需要配置监听程序,通过...

    怎样快速查出Oracle 数据库中的锁等待

    Oracle 数据库锁等待问题解决方案 Oracle 数据库系统中,为了保证数据的一致性,在对数据库中的数据进行操作时,系统会进行对数据相应的锁定。这些锁定中有"只读锁"、"排它锁"、"共享排它锁"等多种类型,每种类型...

    Oracle数据库日常维护

    Oracle数据库的日常维护是确保数据库高效、稳定运行的关键环节。本文将详细介绍Oracle数据库的一些主要维护任务,包括使用Oracle Enterprise Manager进行监控、表空间的扩充方法、解决死锁问题以及SPFILE与PFILE的...

    oracle 检测数据库是否有对象被锁的脚本

    在Oracle数据库管理中,了解如何检测对象被锁的情况至关重要,因为锁定可能会导致数据一致性问题,影响系统的正常运行。本文将详细介绍如何使用提供的脚本`ckobject_lock.sh`和`ckobject_lock.sql`来监控和检测...

    Oracle数据库学习文档(详细)

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统之一,由甲骨文公司开发。它具备高级的数据保护、可靠性和高性能,适用于处理大规模数据和复杂事务处理。本文档为初学者提供了Oracle数据库学习的详细知识点。...

    Oracle数据库性能优化实务闩锁及闩锁优化.ppt

    Oracle数据库性能优化实务闩锁及闩锁优化 Oracle数据库性能优化实务闩锁及闩锁优化是指在Oracle数据库中对性能的优化,以提高数据库的执行效率和稳定性。闩锁是一种机制,用于保护Oracle数据库的核心内存结构,防止...

    《Oracle数据库系统》多媒体课件

    12. **Oracle并发控制**:理解事务的概念,锁的类型和粒度,以及死锁的预防和解决。 13. **数据库设计**:学习数据库设计原则,包括ER模型转换,范式理论的应用,以及数据库规范化的重要性。 14. **Oracle网络配置...

    oracle数据库使用经验word

    1. **Oracle基础知识**:Oracle数据库的基础知识包括数据库架构、表空间管理、数据类型、索引、存储过程和函数、触发器、视图等。理解这些基础知识对于日常的数据库管理和开发至关重要。例如,表空间是存储数据的...

    理解ORACLE数据库锁机制高效维护医院信息系统运行.pdf

    Oracle数据库锁机制是确保数据库并发访问安全的重要工具,尤其在医院信息系统这种高并发、数据敏感的环境中,理解并有效管理锁机制对于系统的高效运行至关重要。本文主要探讨Oracle数据库中的TM锁和TX锁机制,以及...

    Oracle数据库案例教程.pdf

    从给定的文件信息来看,这是一本关于Oracle数据库的案例教程,主要面向初学者,旨在通过实际案例和练习帮助读者掌握Oracle数据库的基础知识和操作技能。以下是对该教程涉及的关键知识点的详细解读: ### Oracle...

Global site tag (gtag.js) - Google Analytics