除非通过加字段来控制加锁也不能让别人看不见oracle本身不能让人不能select

解决方案 »

  1.   

    可以这么考虑!
    1、用户A选出的数据为
    lsh1  1 23  0
    lsh2  0 24  0
    用户A选出数据之后户把flag更新为1
    2、假如用户B这个时候选出的数据也为
    lsh1  1 23  0
    lsh2  0 24  0
    但只要B更新不成功也就达到目的了。
    加上事务级锁可以这样
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    A选择数据并更新,如果在这个期间,B选择数据也更新,则B返回异常!
      

  2.   

    to : penitent(只取一瓢) :
    我不太同意您的意见,
    有三个条件适合使用串行化事务:
    1、具有很高的没有别人修改数据的可能性。
    2、需要事务级的读一致性。
    3、将进行短的事物。一般使用SELECT。FOR UPDATE {NO WAIT}
    来串行化访问。
      

  3.   

    楼主的意图可否这样实现:
    使用一临时表
    当一用户欲要SELECT
    时,将where age>=23 and rownum<3 
    从主表移到临时表等待处理
      

  4.   

    做个临时表
    但临时表比原表多一个字段,控制的是每个session的特征(不是数据库用户),大家都使用同一用户,一定要能区分,可以使用sys_guid这类函数来获得该值然后查询的时候用原表记录 minus 临时表记录大数据量不合适!当然,个人以为,原表加个字段是比较好的选择
    加lock毕竟不好,不能给用户返回错误的!
      

  5.   

    其实方法有很多,只是各有优缺点!
    我看他的过程不大,才建议他这么做。
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    还有,他的过程不可以执行的很频繁吧,只是有可能有这样的情况。
    这种方法也不是不可以
    SELECT。FOR UPDATE {NO WAIT}是锁定该记录,那B一样可以读,
    同样返回异常。
    临时表或加字段,首先要考虑修改数据库的问题,设计阶段还好说。
    返回异常并不是返回错误,异常是可以再处理的。