当一个进程(A)使用
select * from tt for update;
对记录进行加锁,
而另一个进程(B)使用
delete from tt
此时,B进程始终等待A进程释放资源。请问:如何实现让B进程不等待A进程,而直接报错,结束处理!(如:select * from tt for update nowait)

解决方案 »

  1.   

    SQL> create table t as select * from user_tables where rownum<10;表被创建SQL> select table_name from t;TABLE_NAME
    ------------------------------
    AA
    T_TEST
    T
    TEST
    MIKE_TEST0115Session1:
    SQL> select table_name from t for update;TABLE_NAME
    ------------------------------
    AA
    T_TEST
    T
    TEST
    MIKE_TEST0115Session2:
    SQL> /declare
    name varchar2(50) default 'blank';
    begin
    select table_name into name from t where rownum=1 for update nowait;
    delete from t;
    end;ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源 
    ORA-06512: 在 line 4Session1:
    SQL> commit;提交完成Session2:
    SQL> declare
      2  name varchar2(50) default 'blank';
      3  begin
      4  select table_name into name from t where rownum=1 for update nowait;
      5  delete from t;
      6  end;
      7  /PL/SQL 过程成功完成SQL> commit;提交完成Session1:
    SQL> select table_name from t;TABLE_NAME
    ------------------------------
      

  2.   

    当一个进程(A)使用
    select * from tt for update;
    对记录进行加锁,
    而另一个进程(B)使用
    delete from tt
    此时,B进程始终等待A进程释放资源。我认为解决办法是
    减少进程(A) for update锁定的纪录的数量,
    可以通过业务或者行数进行限制,
    循环多次进行操作,进行一定数量的操作以后进行
    commit或者rollback
    这样性能和对服务器的负担都比较好。
      

  3.   

    select * from tt for update;
    对记录进行加锁一般是为了随后的update或删除操作,可以换一种方式,用timestamp来校验数据
    是否发生变化,如果发生变化,则抛出异常或做进一步的处理
      

  4.   

    可能我问的不是很明白,我想问的是oracle中是否存在与informix中“$set lock mode to wait 10;”同效的使用方法?
      

  5.   

    cenlmmx(学海无涯苦作舟) 的方法就可以变相的实现呀.create or replace procedure delete_exception(table_name varchar2,time number)
    as
    name varchar2(50) default 'blank';
    begin
    execute immediate 'select table_field into name from table_name where rownum=1 for update wait number';
    execute immediate 'delete from table_name';
    end;调用包输入表名 和 等待时间数.
      

  6.   

    晕,你的informix中“$set lock mode to wait 10;”是什么作用都不说,怎么回答.不能让我们猜啊.
      

  7.   

    解释:set lock mode to wait 10
    在informix中,建立数据库连接后,显式设定锁等待超时时间为10秒,在该数据库连接中,对任何表的锁资源获取等待时间超过10秒,将中止等待,抛出异常!
    oracle的update wait 10是针对单张表设定的,请高人告知oracle中有没有在一个连接中设定本连接锁等待超时时间的方法!(不是单独针对某张表)
      

  8.   

    就象你说的select * from tt for update nowait,可以先申请锁,申请不到直接就报错了,如果能申请到,那也能DELETE