请问oracle 9i 数据库是否有表锁或表中行锁说法?
              在编程当中怎样避免锁?

解决方案 »

  1.   

    select * from  tablename ... for update
     ---------------------------------------
      加行锁  表级锁:当事务获得行锁后,此事务也将自动获得该行的表锁(共享锁),
      以防止其它事务进行DDL语句影响记录行的更新。事务也可以在进行过程
       中获得共享锁或排它锁,只有当事务显示使用LOCK TABLE语句显式的
       定义一个排它锁时,事务才会获得表上的排它锁,也可使用 LOCK TABLE
       显式的定义一个表级的共享锁  在编程当中怎样避免锁?
      --------------------
      锁定机制是解决并发问题的有效方式,例如防止多个会话同时修改表中的
      同一行。  只要尽快提交事务(commit),oracle 就会释放锁;   死锁:当两个事务需要一组有冲突的锁,而不能将事务继续下去的话,就会
             出现死锁。    找出导致死锁的会话:
        select /*+ NO_MERGE(a) NO_MERGE(b) NO_MERGE(c) */ 'Wait' "Status", a.username, a.machine,
    a.sid, a.serial#, a.last_call_et "Seconds", b.id1, c.sql_text "SQL" 
    from v$session a, v$lock b, v$sqltext c 
    where a.username is not null 
    and a.lockwait = b.kaddr 
    and c.hash_value =a.sql_hash_value 
    union 
    select /*+ NO_MERGE(a) NO_MERGE(b) NO_MERGE(c) */ 'Lock' "Status", a.username, a.machine,
    a.sid, a.serial#, a.last_call_et "Seconds", b.id1, c.sql_text "SQL" 
    from v$session a, v$lock b, v$sqltext c 
    where b.id1 in 
    (select /*+ NO_MERGE(d) NO_MERGE(e) */ distinct e.id1 
    from v$session d, v$lock e 
    where d.lockwait = e.kaddr) 
    and a.username is not null 
    and a.sid = b.sid 
    and b.request=0 
    and c.hash_value =a.sql_hash_value; 
     杀掉导致死锁的进程: alter system kill session 'SID,Serial#'
      

  2.   

    谢谢! leecooper0918(帮助别人,其实也是在帮助自己)!