我现在有多个线程,同时访问一个数据表。每个线程的任务都是一样的,就是每次取一条记录进行分析,然后将这条记录删掉。为了防止多个线程同时访问同一条记录,我的SQL是这么写的:
select x, xx, xxx from t where ROWNUM = 1 for FOR UPDATE NOWAIT。
我的问题是,如果当一个线程访问一条正在被其他线程处理的记录时,应该是报错的,如何才能让线程自动知道哪条记录没有被锁定?从而可以提高效率。
环境是weblogic + oracle

解决方案 »

  1.   

    自动知道哪条数据没有被锁定?这个很难啊。Oracle只有在访问到那条数据的时候才知道那条数据有没有被锁定,因为这个锁是加在块上的。你不如一次取一百条来分析....:)  应该会快一点吧
      

  2.   

    有N个处理器负责数据,但这些处理器取数据的条件又有可能是不一样的,比如说处理器A可能只选择代码等于A的,处理器B只选择代码等于B的,为了使它们尽量做到负载均衡并且不出问题,只好一个处理器起一个线程,去访问数据库了。
    你觉得如何设计才好呢?
      

  3.   

    我意思是你别一次取一条啊....你就这个处理器一下子把代码等于A的全取过来,然后一条一条改完之后再来个commit....那个处理器一下子把代码等于B的全取过来,然后一条一条改完之后再来个commit....我不知道你具体的“处理”是什么哈,想象中是这样比较快
      

  4.   

    但是可能有n个处理代码A的处理器,有n个处理代码B的处理器,如果一个全取完,其他的处理器就会闲置的。所以我想到了一条一条取。这样的负载肯定是最均衡的,但却是以频繁访问数据库作为代价的。
      

  5.   

    你的处理器这么不经用啊?闲一下又不会生锈,你的数据量也不大。如果一个批处理比N个一条一条快,为什么不能只用一个呢? 你硬要分开,就这个处理器取代码A的前100条,那个取代码A的101--200条....反正一个一个的处理是非常非常不合数据库的开发原则的。
      

  6.   

    就用你说的select x, xx, xxx from t where ROWNUM <= 100 for FOR UPDATE NOWAIT啊,你的其它处理器就知道了嘛....
      

  7.   

    你取完了就在程序里记上(已经取到第N条了),下面一个处理器就从N+1开始取?
    -----------------------------如果要是这样的话,我想就没必要用for FOR UPDATE NOWAIT了吧?
      

  8.   

    你取完了就在程序里记上(已经取到第N条了),下面一个处理器就从N+1开始取?
    -----------------------------其实这种作法也很容易导致多个处理器同时访问一段数据。有可能一个处理器还没来得记上取到第N条了,其他的处理就取走了。