我觉得这就是数据一致性的体现。你所说的问题,其实就是read committed和read uncommitted的隔离模式。
oracle缺省是不必等待其他事物提交,oracle采取的是读取rollback中内容的方法。我认为这很有道理,既然是没有提交的数据,就相当于没有发生。那么,另外一个session自然没有必要要得到这块数据。
其实这样做,可以大大提高并发度。Oracle需要block的是对同一条数据的更新操作。SQL Server则采取了缺省read committed模式,在事务没有提交或者回滚前,让其他session(read/update操作同一条记录)都等待的做法,其实就是降低了并发度。但是,SQL Server提供了设置READ UNCOMMITTED,可以让session b不必等待session a提交,直接获得session a的最新修改。这样看来,是提高了并发度,但是对此我显然也是有质疑,因为你读到的数据,也可能被session a rollback掉,那你读到的这个数据能说明什么呢?其实,你仔细想想,其实就是oracle和SQL Server在对待数据一致性上面的理解不同,我不能说那个更有意义。但是,我一直认为SQL Server这样做,显然是简化了数据库结构,其对于rollback的控制可以简化很多。这是体系架构上的差别导致的。

解决方案 »

  1.   

    两个更新的事务可以使用select * from 11 for update ;方式,
    当然可以指定事务的隔离级别使用可序列化(Serializable)可以完全避免
    脏读(Dirty Read) 
    不可重复读(Non-Repeatable Read) 
    幻像读(Phantom Read) 
      

  2.   

    to  enhydraboy(乱舞的浮尘):你说的很有道理,但我还是觉得Oracle这样做会导致错误,因为她不能保证自己读出的数据是最新的,而SQL server就能我觉得。
    to tyrone98(林林) :可序列化,脏读(Dirty Read) 不可重复读(Non-Repeatable Read) 
    幻像读(Phantom Read)都是啥意思啊?能解释一下吗?
    3q
      

  3.   

    对于已经修改还没有commit的数据来说,你另一个session读取得就是最新的,是从回滚段里读出来的
    虽然你修改了,但是没有commit,oracle并没有修改在数据文件中的值
    假如他rollback,你的读取就不会有问题
    如果你需要读取得数据进行计算,那就for update,保证你的计算的准确性
      

  4.   

    楼主理解有问题,既然人家没有commit,那为什么修改后的数据是最新的?如果rollback怎么办?特别是在一个存储过程中,你要原子化的修改几个表(即表之间有逻辑关系,必须同时修改)后提交,如果修改一个后别的会话就立即能看到修改后的效果,那么如果此会话在此时处理那几个表,就会出逻辑错误。而Oracle的存储过程保证这几个表是同时变化的,提交以后,别的会话才能看到效果,此时几个表又是逻辑一致的了
      

  5.   

    to ern:"楼主理解有问题,既然人家没有commit,那为什么修改后的数据是最新的?"
    我是说,要commit的那个人肯定是要修改数据的,我们假设他不rollback 这种事情一定有吧
    并不是每个人都会rollback;
    你说的存储过程的东西有道理我这里看到一个解决办法,加上自己的一小段代码,含有for update语句
      

  6.   

    to Jackyhou2004(波) 
    "你说的很有道理,但我还是觉得Oracle这样做会导致错误,因为她不能保证自己读出的数据是最新的,而SQL server就能我觉得。"
    ==>我觉得你还是没有理解透,有点钻牛角尖了。我说过了,这是SQL Server和Oracle各自对于这个问题的理解不同。
    反问一下,既然没有commit过,那么何谓最新的数据,获得又有什么积极的意义,只会导致根多的错误的产生。又反过来说,别人都没有commit过(确认要提交),SQL Server竟然可以让别人简单地设置一个read uncommitted就可以可以读到,岂不是有安全泄密的问题?
      

  7.   

    to Jackyhou2004(波)
    "我是说,要commit的那个人肯定是要修改数据的,我们假设他不rollback 这种事情一定有吧
    并不是每个人都会rollback"
    ==>这个观点更可有问题了,既然存在有rollback的可能,那么在他还没有做出决定之前,你可以就武断地认为一定会commit呢?
    Oracle的这个方法,我认为是很符合逻辑的,没有提交过的数据,可以说对于其他session来说,就是透明的。从这种隔离方案的实现上,可以充分看出SQL Server的体系架构上和oracle的差距。
      

  8.   

    to enhydraboy(乱舞的浮尘):
     多谢指点~~可能是我水平不够,对这个问题理解的还是不够好。可能随着知识的增加和经验的丰富自然就会明白的。学东西,特别是像Oracle这样世界级的数据库更是不可能一下子就搞明白的,欲速则不达阿~~谢谢enhydraboy(乱舞的浮尘)一次一次的不吝赐教:)
    谢谢ern,谢谢兄弟们
    3q