是这样的,
第一步:客户端检索数据时记录的对应的ROWID,然后检索游标断开
第二步:客户端利用记录的ROWID删除对应的数据,会不会删除错误的数据?在多用户时,其他用户删除了这些数据(以上ROWID对应),然后又添加了新数据,新数据会利用没有使用的ROWID 这样第一步的用户记录的ROWID就是新数据的,就会出错1.谁能深入解释解释这种现象?50分
2.如何避免以上现象?75分
3。ROWID如何才能始终不重复产生?752,3 解决其它贴子给分

解决方案 »

  1.   

    这种设计不是很合理。rowid是记录存储的物理标志,这个不是你的程序控制的,建议增加一个序列,用序列代替rowid,你的3个问题都可以迎刃而解
      

  2.   

    用序列来处理,至于你说的前两个问题,oracle早就帮你考虑了,你只要用事务来处理就没有问题,或者就用锁
      

  3.   

    to  nowait(独行天涯路) , qiaozhiwei(乔) 
    跟事务已经没有关系了,客户端记录的是短块后的RowID如果使用序列,是加一个字段,然后用触发器读取序列实现自动增加吗?
    有没有其他好办法?如果这样? ROWID岂不是成了废物没有什么用处?
      

  4.   

    使用序列就不用触发器了,序列是这样用的
    create sequence SEQ
    minvalue 1
    maxvalue 999999999999999999999999999
    start with 61
    increment by 1
    cache 30
    order;使用:insert into tname values(序列名.nextval)从来没见过哪个系统会去用ROWID来当自己的主键的....我的对ROWID的理解是建立索引是基于ROWID来寻找数据的,ROWID记录数据的物理位置。
      

  5.   

    to  sasacat(傻傻猫) insert into tname values(序列名.nextval) 这样写和触发器不是一样,只不过是谁写入的问题
    我可能不明白你的意思,能详细说一说
    既然ROWID记录数据的物理位置,那么说没有实际的应用意义
      

  6.   

    rowid的格式:数据对象编号        文件编号        块编号           行编号OOOOOO              FFF             BBBBBB           RRR每条记录有一个rowid,rowid是用来保存每条记录的物理位置的。如果一个记录很大,跨越了2个block,那么rowid会把这2部分标记为一个rowid的,确定唯一的一条记录。
      

  7.   

    to rolandzhang() 那么rowid 有什么实际的应用意义?这完全是数据库内部的是东西,有什么应用
      

  8.   

    可以通过rowid精确定位记录啊
      

  9.   

    to rolandzhang() 通过rowid定位记录,得到的记录怎么知道就是你想要的记录,
    rowid只是位置,又不是主键
      

  10.   

    rowid是某一条记录的唯一的物理位置编号,所以是可以精确定位记录的。
      

  11.   

    to hevin没错位置是准确的,但是准确的位置,放的就是准确的数据,肯能已经不是你原来的数据了也就是删除时,使用RowID可能删除不改删除的数据谁能再说明????????
      

  12.   

    第一步:客户端检索数据时记录的对应的ROWID,然后检索游标断开
    第二步:客户端利用记录的ROWID删除对应的数据,会不会删除错误的数据?
      1.会,如果你增加或者删除了数据,就会
      2.ROWID和select的内容相关,如果你select出相同的内容,rowid的顺序就可能相同
        2.1但是就算相同的表,如果select的条件不同,rowid定位的数据就可能不同。
        2.2就算slelect条件相同,如果select选出的结果不同(比如删除或者增加的数据),rowid定位的数据也可能不同。
    在多用户时,其他用户删除了这些数据(以上ROWID对应),然后又添加了新数据,新数据会利用没有使用的ROWID 这样第一步的用户记录的ROWID就是新数据的,就会出错
        见回答2.21.谁能深入解释解释这种现象?50分
    2.如何避免以上现象?75分
      1.在不是一个事务中,不要采取ROWID的方式
      2.在一个事务中,采用表锁(table lock)
    3。ROWID如何才能始终不重复产生?75
      1.ORACLE自己产生的,不是重复产生,而是对表的行作了索引
         你甚至可以自己控制ROWID
      例如,在分页的时候,我们经常用ROWID控制,但是ORDER BY对ROWID无效,
      我们一般把ORADLE BY的结果作为SELECT的表,就可以得到我们想要的
      SELECT * FORM 
       (SELECT * FROM AAA WHERE xxx ORDER BY yyy) A [我们自己控制了A的ROWID]
       WHERE zzz
      

  13.   

    2.1的补充,意思是,你select写的不同,ROWID可能不同
    见,最后的回答
      例如,在分页的时候,我们经常用ROWID控制,但是ORDER BY对ROWID无效,
      我们一般把ORADLE BY的结果作为SELECT的表,就可以得到我们想要的
      SELECT * FORM 
       (SELECT * FROM AAA WHERE xxx ORDER BY yyy) A [我们自己控制了A的ROWID]
       WHERE zzz