2、在select语句后加入for  update,取出修改status时执行commit,但这样select语句取不到数据,返回记录集为空. 如果两个客户端取得的结果集相同,其中一个选取,并作了修改,commit后,第二个当然检索不到数据了。
这个逻辑不对吗?

解决方案 »

  1.   

    可以考虑另外建立一个表B,假设你现在要处理的表为A,当一个客户从表A取出一条记录的时候,在B中增加一条记录,记录当前的用户和A表中的主键字段,如果这条记录能插入到B表中,说明没有其他人在使用,当前的调用者可以使用这个记录,如果不能插入,说明有其他人在使用这个记录了。调用者使用完成后从B表中删除这条记录。
      

  2.   

    谢谢各位的回复!!我想要的结果是多个客户端同时按取数据按钮时能取得不同的数据,我在条件中设置
    了rownum=1,只取第一条纪录,主要是select语句执行时间比较长,在没取到纪录时
    别的客户端再取时两个人就取到了同一条纪录。
    to bzszp(www.bzszp.533.net):我只用一个客户端测试时记录集就返回eof
    to wl3721() :我在取出记录时坐了一些判断就把select中作为条件的status更新了,
    提交后再取绝对不会取到这条纪录,另一个客户端应该是在更新前取到的,用另一个
    表处理应该和这样没有本质的区别。不知我把select到update的流程全部写到存储过程中不知能不能避免这种情况,原来
    这中间有很多判断都是加在程序中的,明天试一下
      

  3.   

    不会的。
    测试:
    打开两个sql*plus
    no.1:
    08:45:02 SQL> select * from ttree where rownum=1 for update;ID         PID             PRICE
    ---------- ---------- ----------
    B          A                   2已用时间:  00: 00: 00.47
    08:45:46 SQL> update ttree set price=20 where rownum=1;已更新 1 行。已用时间:  00: 00: 00.63
    08:45:54 SQL> commit;提交完成。已用时间:  00: 00: 00.31
    08:45:57 SQL> no.2:
    08:44:32 SQL> select * from ttree where rownum=1 for update;ID         PID             PRICE
    ---------- ---------- ----------
    B          A                  20已用时间:  00: 00: 42.41
    08:45:57 SQL> 
    注意时间,在no.1没有提交之前,no.2的语句一直在等待。
      

  4.   

    我用PL/SQL Developer测试过,是这种情况,不过我在程序中用ADO访问时,一加上for update返回记录集为空了,是connection和recordset有什么特别的设置吗?
      

  5.   

    这个不清楚
    只要时再一个会话里面应该就没有问题
    你看看是否有什么auto commit之类的属性。
    你的这种情况用for update是再合适不过了。