Oracle本身具有行锁的机制,使得A加锁修改数据时,B还能够读取到修改前的数据。其实你想解决这个问题(虽然我还不一定非常明确这个问题的意思),是不是可以考虑用另外一种方式来解决呢?比如说,A取到了这30条,那么就把这30条给删除(存到另外一个表),B就查不到了。然后根据操作的情况,再把这30条写回,或者是确实删除。虽然方法笨一些,比较烦琐,而且也会有万一在A取了记录后宕机的情况,这只是一种思路而已。或者B在查询虽然查询出来了,但是在提交前再确认查询一次,也可以啊。就是说,你不必拘泥于用锁来实现。
只有FOR UPDATE才加排它锁.
不过你既然加了for update行共享锁,
那么你的语句都这么写
select * from cardinfo where rownum<=5 for update no wait
但是这样有一个缺点,就是如果A选了30条,B也来选这30条,显然取不到,
就会抛一个异常(当然这个异常你可以自己处理),就害怕B又来取,就麻烦了;
所以你可以建立临时表或是增加标志位,A一选到30条,就设置标志为已选(这个时间段是很短的),B如果在A设置之前还是选这30条(这个可能性很小),肯定会抛出异常,但B再选的时候,应当就选不到A的了。反之亦然