假设有一个表t1
A     B
----  -----
10    test
11    haha
12    ccccupdate t1 set b='right' where a=10    ---这个是表锁
select * from t1 where a=10 for update of b nowait --这个配合游标据说是行级锁
那么,兄弟,以下的是什么锁?有没有办法证明一下?
update (select * from t1 where a=10) set b='right'我现在碰到并发性的问题,行级锁可以大大增强数据库的并发性,别小看这个sql语句!:)请高手指导!!谢了。

解决方案 »

  1.   

    我觉的还是行锁。(select * from t1 where a=10)只是t1别名
      

  2.   

    在Oracle中有没有象sql那个的执行报告?也就是说:能不能用事实来说明这个是锁表还是锁行?
      

  3.   

    select V$SESSION.sid,v$session.SERIAL#,v$process.spid,
    rtrim(object_type) object_type,rtrim(owner) || '.' || object_name object_name,
    decode(lmode,   0, 'None',
    1, 'Null',
    2, 'Row-S',
    3, 'Row-X',
    4, 'Share',
    5, 'S/Row-X',
    6, 'Exclusive', 'Unknown') LockMode,
    decode(request, 0, 'None',
    1, 'Null',
    2, 'Row-S',
    3, 'Row-X',
    4, 'Share',
    5, 'S/Row-X',
    6, 'Exclusive', 'Unknown') RequestMode
    ,ctime, block b,
    v$session.username,MACHINE,MODULE,ACTION,
    decode(A.type,
    'MR', 'Media Recovery',
    'RT','Redo Thread',
    'UN','User Name',
    'TX', 'Transaction',
    'TM', 'DML',
    'UL', 'PL/SQL User Lock',
    'DX', 'Distributed Xaction',
    'CF', 'Control File',
    'IS', 'Instance State',
    'FS', 'File Set',
    'IR', 'Instance Recovery',
    'ST', 'Disk Space Transaction',
    'TS', 'Temp Segment',
    'IV', 'Library Cache Invalida-tion',
    'LS', 'Log Start or Switch',
    'RW', 'Row Wait',
    'SQ', 'Sequence Number',
    'TE', 'Extend Table',
    'TT', 'Temp Table',
    'Unknown') LockType
    from (SELECT * FROM V$LOCK) A, all_objects,V$SESSION,v$process
    where A.sid > 6
    and object_name<>'OBJ$'
    and A.id1 = all_objects.object_id
    and A.sid=v$session.sid
    and v$process.addr=v$session.paddr;
    执行上面的语句察看lockmode
      

  4.   

    update t1 set b='right' where a=10      ---这个是表锁
    -------------------------------------------------------------------------
     ----简直胡扯楼主真是个oracle菜鸟,
    呵呵,这么简单的问题还要问,
    典型都是DML行琐
      

  5.   

    ORACLE采用意向锁机制,进行DML操作时在行级和表级同时加锁,具体可以查看V$lock视图,例如:
    update scott.emp set ename='aaa' where empno=7369;select * from v$lock where sid=20;ADDR     KADDR           SID TYPE        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK
    -------- -------- ---------- ---- ---------- ---------- ---------- ---------- ---------- ----------
    67B7AD90 67B7AE9C         20 TX       524294      25679          6          0         29          0
    67B4E074 67B4E088         20 TM        30139          0          3          0         29          0
    update (select * from scott.emp where empno=7369) set ename='aaa'ADDR     KADDR           SID TYPE        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK
    -------- -------- ---------- ---- ---------- ---------- ---------- ---------- ---------- ----------
    67B7AD90 67B7AE9C         20 TX       131097      25689          6          0          9          0
    67B4E074 67B4E088         20 TM        30139          0          3          0          9          0可见update scott.emp set ename='aaa' where empno=7369和update (select * from scott.emp where empno=7369) set ename='aaa'
    的加锁机制是相同的select *  from scott.emp where empno=7369 for update nowaitADDR     KADDR           SID TYPE        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK
    -------- -------- ---------- ---- ---------- ---------- ---------- ---------- ---------- ----------
    67B7AD90 67B7AE9C         20 TX       262182      25685          6          0          9          0
    67B4E074 67B4E088         20 TM        30139          0          2          0          9          0for update的表级锁模式为2,说明表中的某行获得了共享锁