行级锁,系统在delete ,update 时,自动加的锁。另一种是,
操作者加的,防止他人同时操作,如,select * from tbl for update nowait,
当遇到 rollback,commit,解锁

解决方案 »

  1.   

    select * from tbl for update  产生独占锁,其他用户要dml操作必须等待commit或者rollback  ,select 仍然可以。oracle专家编程上面有一张专门介绍了锁
      

  2.   

    ORACLE专家编程在哪里,很想了解ORACLE的锁。
    借楼主一个地方,应该对楼主也有帮助的。
    select for update后,如何检测该行记录已被锁呢?因为不检测的话,再次select for update就会死锁的吧。
      

  3.   

    怎么快速查找锁与锁等待 
    [A]数据库的锁是比较耗费资源的,特别是发生锁等待的时候,我们必须找到发生等待的锁,有可能的话,杀掉该进程。 
    这个语句将查找到数据库中所有的DML语句产生的锁,还可以发现,任何DML语句其实产生了两个锁,一个是表锁,一个是行锁。 
    可以通过alter system kill session ‘sid,serial#’来杀掉会话 
    SELECT /*+ rule */ s.username, 
    decode(l.type,'TM','TABLE LOCK', 
                  'TX','ROW LOCK', 
                  NULL) LOCK_LEVEL, 
    o.owner,o.object_name,o.object_type, 
    s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser 
    FROM v$session s,v$lock l,dba_objects o 
    WHERE l.sid = s.sid 
    AND l.id1 = o.object_id(+) 
    AND s.username is NOT NULL 
    如果发生了锁等待,我们可能更想知道是谁锁了表而引起谁的等待 
    以下的语句可以查询到谁锁了表,而谁在等待。 
    SELECT /*+ rule */ lpad(' ',decode(l.xidusn ,0,3,0))||l.oracle_username User_name, 
           o.owner,o.object_name,o.object_type,s.sid,s.serial# 
    FROM v$locked_object l,dba_objects o,v$session s 
    WHERE l.object_id=o.object_id 
    AND l.session_id=s.sid 
    ORDER BY o.object_id,xidusn DESC 
    以上查询结果是一个树状结构,如果有子节点,则表示有等待发生。如果想知道锁用了哪个回滚段,还可以关联到V$rollname,其中xidusn就是回滚段的USN 
      

  4.   

    beckhambobo(beckham) :
    问一下:
    一个程序使用过select * from table1 where rkey=1 for update后,此时只有rkey为1的记录被加了行锁,你上面写的那些SQL如何查出该条记录是否已被锁住。上面的语句只能查出是哪个表被锁,能具体到哪一行吗?