`

Oracle锁机制锁问题的详细分析

 
阅读更多

在任何多用户数据库应用中,最终必然会出现两个用户希望同时处理相同记录的情况.这种情况在逻辑上是不可能的,并且数据库必须确保其在物理上也是不可能的.事务隔离性原则要求数据库保证:在 ,这个会话无法影响另一个会话,并且后者也无法看到前者.为了实现这个要求,数据库创行话并发的数据访问,甚至在多个会话请求访问相同的记录时,数据库也必须确保这些会话排队依次进行.
借助于记录和表锁定机制,我们可以实现并发的串行化.oracle数据库中的锁定是完全自动的.一般而言,只有在试图结合软件与自动锁定机制是或者编程人员编写的代码太糟糕时才会引发某些问题.

共享锁与排他锁

Oracle数据库中锁定的标准级别保证了最大可能的并发级别也就是说,如果某个会话正在更新一条记录,那么只有这条记录会被锁定.此外,锁定这条记录是为了防止其他会话对其进行更新,其他会话可以随时执行读取操作.只有在使用commit或rollback命令结束事务之后,锁定才会被解除.这种锁定是一个”排他锁”:在指定记录上请求排他锁的第一个会话会得到这个锁定,其他请求对该记录进行写访问的会话则必须等待.虽然这条记录已通过锁定会话进行了更新,但是对其进行读访问你是被允许的(而且经常会出现这种情况),并且这些读操作会涉及撤销数据的使用,从而确保都会回并不会看到任何未被提交的变化对于一条记录或一个完整表上的一个排他锁来说,每次只能有一个会话可以获得这个排他锁,不过许多会话可以同时获得相同对象上的”共享锁”.在一条记录上设置共享锁毫无意义,其原因在于锁定一条记录的唯一目的就是不允许其他会话更改它.共享锁被置于整个表上,同时许多会话可以获得同一个表上的共享锁.在一个表上放置共享锁的目的是为了防止另一个会话获得这个表上的排他锁(在已存在共享锁的情况下无法再获得排他锁).在表上防止排他锁是需要执行DDL语句.如果其他任何会话已经在一个表上放置了共享锁,那么我们就无法执行修改某个对象的语句(例如删除这个表的某一列).
为了在记录上执行DML语句,当前会话必须获取待更新记录上的排他锁以及包含这些记录的表上的共享锁.如果另一个会话已经获取了待更新记录上的排他锁,那么当前会话将被挂起,直至使用COMMIT或ROLLBACK命令解除这些锁定,如果另一个会话已经获取了待修改记录的表上的共享锁以及其他记录上的排他锁,那么就不存在任何问题.一个表上的排他锁会锁定这个表,但是,如果不需要执行DDL语句,那么我们就可以不锁定整个表的默认锁定机制.

提示:只有在特别请求并且编程人员具有充分理由的情况下,才可以要求在整个表上放置排他锁.

DML锁与DDL锁
所有DML语句都至少需要两种锁定:受影响记录上的排他锁,以及包含受影响记录的表上的共享锁.排他锁能够防止其他会话干预指定的记录,而共享锁则能够阻止其他会话使用DDL语句修改表的定义.这两种锁定会被自动请求.如果某条DML语句在指定记录上无法获取所需的排他锁,那么这条语句会被挂起直至获得所需的排他锁.
执行DDL命令需要使用所涉及对象上的排他锁.只有在针对指定表的所有DML事务结束,并且记录上的排他锁以及表上的共享锁都被解除之后,我们才可以获得执行DDL命令所需的排他锁,任何DDL语句所需的排他锁都是被自动请求的.但是,如果无法获取所需的排他锁(通常是因为其他会话已经获得用于DML语句的共享锁),那么DDL语句就会由于错误立即终止.

例子:
1.       使用SQL*PLUS,作为用户SYSTEM连接数据库.
2.       创建一个表,并且在这个表中插入一条记录.
>create table t1(c1 number);
       >insert into t1 values(1);
       >commit;
3.再次使用SQL*PLUS并作为用户SYSTEM进行连接,从而打开另一个会话.
4.在第一个会话中执行一个DML命令,这个命令会在插入的记录上放置一个排他锁,同时还会在创建的表上放置一个共享锁.
   >update table t1 set c1=2 where c1=1;
5.如下所示,在第二个会话中执行第一条针对新建表的DDL语句.
   >alter table t1 add(c2 date);
   error at line 1:
ora-00054:resource busy and acquire with nowait specified
因为DDL语句需要表上的排他锁,而这与DML语句已在表上放置了共享锁相冲突,所以试图在表中插入一个列的这条DDL语句会失败.需要注意的是:在类似情况下,DML语句会等待并不断进行尝试,直至获得其所需的锁(换句话说就是挂起);而DDL语句则会由于错误立即终止.
       6.在第一个会话中,提交当前事务
          >commit;
       7.在第二个会话中,重新执行步骤5.此时,因为不纯在与DDL排他锁相冲突的DML共享锁,因此DDL语句将成功的执行.
       8.在第一个会话中 ,锁定整个表.
        >lock table t1 in exclusive mode;
       9.在第二个会话中,插入一条记录.此时,这个会话将被挂起.
        >insert into t1 values (1,sysdate);
       10.在第一个会话中,通过执行COMMIT命令解除整个表上的锁定.需要注意的是,ROLLBACK命令也可以实现相同的目的.
        >commit;
       11.第二个会话会释放并且现在会完成插入操作.随后,执行COMMIT命令,终止当前事务斌且解除该记录上的排他锁.

关于如何解决死锁的问题.
1.查哪个过程被锁
查V$DB_OBJECT_CACHE视图:
SELECT * FROM V$DB_OBJECT_CACHE WHERE OWNER=''过程的所属用户'' AND LOCKS!=''0'';

2. 查是哪一个SID,通过SID可知道是哪个SESSION.
查V$ACCESS视图:
SELECT * FROM V$ACCESS WHERE OWNER=''过程的所属用户'' AND NAME=''刚才查到的过程名

 

 

本本转载自http://www.blogjava.net/imdosop/archive/2008/11/07/239266.html

分享到:
评论

相关推荐

    oracle解锁,死锁

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

    oracle锁表处理

    ### Oracle锁表处理 在Oracle数据库管理中,锁机制是一种重要的资源管理手段,用于控制并发事务对数据资源的访问,防止多个用户同时修改相同的数据,从而确保数据的一致性和完整性。然而,在高并发环境下,锁的争用...

    Oracle锁 图例

    总结,Oracle锁机制是数据库并发控制的核心,理解并熟练掌握锁的使用和管理对于优化数据库性能、避免并发问题至关重要。通过使用适当的工具和技巧,我们可以有效地监控和解决锁相关问题,从而提高系统的稳定性和响应...

    快速查找oracle锁对象

    3. **使用SQL Trace和Trace分析**:开启会话的SQL Trace,收集相关会话的详细执行信息,通过解析Trace文件,可以发现造成锁等待的具体SQL语句。 4. **使用专用工具**:提供的压缩包文件中可能包含了一个名为`fast_...

    ORACLE锁深入分析

    总之,Oracle锁机制是其并发控制的核心,通过精细的锁类型和模式,Oracle能够在保证数据一致性的同时,支持多个并发事务高效地访问数据库资源。了解并掌握Oracle锁的原理和应用,对于优化数据库性能和解决并发问题至...

    oracle数据库锁使用

    Oracle的锁机制保证了事务的隔离性,防止了并发操作导致的数据不一致。锁的兼容性决定了不同类型的锁在同一时刻可以并存的情况。例如,S锁与S锁、RS锁与RS锁、RX锁与RX锁之间是兼容的,但S锁与X锁、RS锁与X锁、RX锁...

    oracle常见的锁查询和处理

    Oracle数据库的锁机制是保证数据并发访问安全的重要手段,它主要分为行级锁(TX锁)和表级锁(TM锁)。行级锁确保在多用户环境下,同一时间只有一个用户可以更新特定的数据行,而其他用户可以读取,但不能进行修改。...

    ORACLE关于锁和V$LOCK的分析.docx

    ORACLE 锁机制和 V$LOCK 视图分析 Oracle 数据库为了实现并发操作,使用了锁机制来控制对数据的访问。锁机制是 Oracle 数据库并发控制的核心机制之一。锁机制能够有效地防止多个用户同时访问同一个数据项,避免了...

    oracle 锁及并发性

    ### Oracle 锁与并发性的深度解析 #### 一、Oracle 锁的概念与作用 ...综上所述,Oracle中的锁机制对于确保数据完整性和一致性至关重要。理解不同类型的锁及其应用场景有助于开发人员更有效地设计和优化数据库应用。

    Oracle的锁内幕解惑

    本文旨在深入探讨Oracle锁机制的内部原理,特别是针对DML锁、DDL锁以及Latch等锁机制进行详细解析,帮助DBA更好地理解和应对实际工作中遇到的各种锁问题。 #### 二、Oracle锁机制概览 Oracle的锁机制可以大致分为...

    oracle查锁和解锁命令

    #### 一、Oracle锁机制简介 在Oracle数据库中,锁是用来控制多个用户对同一数据资源访问的一种机制,目的是为了防止并发操作导致的数据不一致问题。锁分为多种类型,包括行级锁、表级锁等,每种锁都有其特定的应用...

    oracle锁表查询

    #### 一、Oracle锁机制简介 在Oracle数据库中,为了确保数据的一致性和并发性,采用了一种称为“锁”的机制来控制对数据资源的访问。锁可以防止多个用户同时修改同一数据,从而避免数据冲突。在Oracle中,锁主要...

    关于Oracle数据库中的锁机制深入研究

    Oracle数据库的锁机制是保证多用户并发访问数据库时数据一致性和完整性的关键工具。数据库作为一个共享资源,如果没有有效的并发控制,可能导致数据不一致,影响事务的正常执行。本文深入探讨了Oracle数据库的锁机制...

    oracle 解锁 语句

    本文将详细介绍如何在Oracle中使用特定的SQL语句解锁被锁定的对象或会话。 #### 二、基本概念解析 在深入探讨具体的解锁方法之前,我们需要了解几个关键的概念: - **锁定(Lock)**:锁定是在数据库对象上设置的...

    关于oracle锁的分析-驴妈妈旅游网DBA

    本篇将深入解析Oracle锁的相关知识点,结合驴妈妈旅游网DBA的经验分享,以帮助你更好地理解和应用这些概念。 一、Oracle锁的类型 Oracle中的锁主要分为以下几种类型: 1. 表级锁:包括表的读锁(SHARE)和写锁...

    Oracle与sql简单优化与锁机制浅析.ppt

    本文将深入探讨Oracle数据库的基础概念、SQL优化以及锁机制。 首先,Oracle数据库的对象存储结构是理解其工作原理的关键。在Oracle中,数据以Segment的形式存储,Segment是数据库对象(如表、索引)在磁盘上的物理...

    Oracle杀锁的语句

    在Oracle数据库管理过程中,锁定是确保数据一致性的重要机制之一。但有时,长时间运行的事务或错误配置的应用程序可能会导致锁定情况无法自动解除,这会严重影响系统的性能甚至导致关键业务流程中断。因此,了解如何...

    oracle由于对象被锁住无法编译处理

    这种情况主要发生在当Oracle中的包、函数或过程正在被某个会话调用时,如果尝试对这些对象进行编译或者结构上的修改,就可能会遭遇锁机制的阻碍,导致操作无法完成。下面将深入解析这一问题的成因、识别方法以及解决...

    对oracle锁几种模式的理解

    ### 对Oracle锁几种模式的理解 #### 一、Oracle锁模式概述 在Oracle数据库中,为了保证数据的一致性和完整性,引入了多种类型的锁机制。这些锁机制能够有效地控制并发操作,防止不同用户或进程间的相互干扰。...

Global site tag (gtag.js) - Google Analytics