Oracle本身具有行锁的机制,使得A加锁修改数据时,B还能够读取到修改前的数据。其实你想解决这个问题(虽然我还不一定非常明确这个问题的意思),是不是可以考虑用另外一种方式来解决呢?比如说,A取到了这30条,那么就把这30条给删除(存到另外一个表),B就查不到了。然后根据操作的情况,再把这30条写回,或者是确实删除。虽然方法笨一些,比较烦琐,而且也会有万一在A取了记录后宕机的情况,这只是一种思路而已。或者B在查询虽然查询出来了,但是在提交前再确认查询一次,也可以啊。就是说,你不必拘泥于用锁来实现。

解决方案 »

  1.   

    ORACLE当然SELECT是不加SELECT锁的.
    只有FOR UPDATE才加排它锁.
      

  2.   

    锁对select 是没有办法的,
    不过你既然加了for update行共享锁,
    那么你的语句都这么写
    select * from cardinfo where rownum<=5  for update no wait
    但是这样有一个缺点,就是如果A选了30条,B也来选这30条,显然取不到,
    就会抛一个异常(当然这个异常你可以自己处理),就害怕B又来取,就麻烦了;
    所以你可以建立临时表或是增加标志位,A一选到30条,就设置标志为已选(这个时间段是很短的),B如果在A设置之前还是选这30条(这个可能性很小),肯定会抛出异常,但B再选的时候,应当就选不到A的了。反之亦然