最近看了一些文档,里面内容有提到过ORACLE和其他数据库中实现锁的机制不太一样。在ORACLE中的锁好像占用的资源很少,而在其他数据库中锁好像要占用较多的资源。
这是为什么呢?希望有所了解的帮忙解答一下,不用太详细,大概说一下两种实现方法就可以了。

解决方案 »

  1.   

    去读一下关于oracle数据库一致性读以及并发(Data Concurrency and Consistency)的文章你说的实现方法指的是什么呢?
      

  2.   

     Oracle数据库的锁类型    根据保护的对象不同,Oracle数据库锁可以分为以下几大类:DML锁(data locks,数据锁),用于保护数据的完整性;DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;内部锁和闩(internal locks and latches),保护数据库的内部结构。    DML锁的目的在于保证并发情况下的数据完整性,本文主要讨论DML锁。在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。    当Oracle执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位。这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。TM锁包括了 SS、SX、S、X等多种模式,在数据库中用0-6来表示。不同的SQL操作产生不同类型的TM锁。如表1所示。    在数据行上只有X锁(排他锁)。在 Oracle数据库中,当一个事务首次发起一个DML语句时就获得一个TX锁,该锁保持到事务被提交或回滚。当两个或多个会话在表的同一条记录上执行 DML语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。当第一个会话提交后,TX锁被释放,其他会话才可以加锁。    当Oracle数据库发生TX锁等待时,如果不及时处理常常会引起Oracle数据库挂起,或导致死锁的发生,产生ORA-60的错误。这些现象都会对实际应用产生极大的危害,如长时间未响应,大量事务失败等。    TX锁等待的分析    在介绍了有关地Oracle数据库锁的种类后,下面讨论如何有效地监控和解决锁等待现象,及在产生死锁时如何定位死锁的原因。    监控锁的相关视图 数据字典是Oracle数据库的重要组成部分,用户可以通过查询数据字典视图来获得数据库的信息。和锁相关的数据字典视图如表2所示。    TX锁等待的监控和解决在日常工作中,如果发现在执行某条SQL时数据库长时间没有响应,很可能是产生了TX锁等待的现象。为解决这个问题,首先应该找出持锁的事务,然后再进行相关的处理,如提交事务或强行中断事务。    死锁的监控和解决在数据库中,当两个或多个会话请求同一个资源时会产生死锁的现象。死锁的常见类型是行级锁死锁和页级锁死锁,Oracle数据库中一般使用行级锁。下面主要讨论行级锁的死锁现象。    当Oracle检测到死锁产生时,中断并回滚死锁相关语句的执行,报ORA-00060的错误并记录在数据库的日志文件alertSID.log中。同时在user_dump_dest下产生了一个跟踪文件,详细描述死锁的相关信息。    在日常工作中,如果发现在日志文件中记录了ora-00060的错误信息,则表明产生了死锁。这时需要找到对应的跟踪文件,根据跟踪文件的信息定位产生的原因。    如果查询结果表明,死锁是由于bitmap索引引起的,将IND_T_PRODUCT_HIS_STATE索引改为normal索引后,即可解决死锁的问题。
        
       
    表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    
       
    表2 数据字典视图说明
    视图名  描述  主要字段说明
    v$session  查询会话的信息和锁的信息。  sid,serial#:表示会话信息。program:表示会话的应用程序信息。row_wait_obj#:表示等待的对象。和dba_objects中的object_id相对应。
    v$session_wait  查询等待的会话信息。  sid:表示持有锁的会话信息。Seconds_in_wait:表示等待持续的时间信息Event:表示会话等待的事件。
    v$lock  列出系统中的所有的锁。  Sid:表示持有锁的会话信息。Type:表示锁的类型。值包括TM和TX等。ID1:表示锁的对象标识。lmode,request:表示会话等待的锁模式的信息。用数字0-6表示,和表1相对应。
    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一致。
        
      

  3.   

    谢谢回答
    不过我想问的不是ORACLE的锁有哪些类型以及锁的简介重点是“为什么锁在ORACLE中占用资源是可以不用专门考虑的,因为它比较少,而在其他数据库中锁是个很耗资源的东西”
    我想谁能从锁的实现机理上来解释一下区别。呵呵
      

  4.   

    楼主的问题在tom的Export one-on-one Oracle第三章中有专门的介绍,这可是学习Oracle的经典书,此书的下载见
    http://download.csdn.net/down/340345/tillmidnight
      

  5.   

    呵呵 majy  wildwave  刚我去下载的时候看到你们的名字了
      

  6.   

    对了 今天在一个帖子里看到了 CR BLOCK
    有人知道这个是什么意思吗我从来没看到过 刚去网上搜了下也没找到