我觉得这就是数据一致性的体现。你所说的问题,其实就是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的控制可以简化很多。这是体系架构上的差别导致的。
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的控制可以简化很多。这是体系架构上的差别导致的。
当然可以指定事务的隔离级别使用可序列化(Serializable)可以完全避免
脏读(Dirty Read)
不可重复读(Non-Repeatable Read)
幻像读(Phantom Read)
to tyrone98(林林) :可序列化,脏读(Dirty Read) 不可重复读(Non-Repeatable Read)
幻像读(Phantom Read)都是啥意思啊?能解释一下吗?
3q
虽然你修改了,但是没有commit,oracle并没有修改在数据文件中的值
假如他rollback,你的读取就不会有问题
如果你需要读取得数据进行计算,那就for update,保证你的计算的准确性
我是说,要commit的那个人肯定是要修改数据的,我们假设他不rollback 这种事情一定有吧
并不是每个人都会rollback;
你说的存储过程的东西有道理我这里看到一个解决办法,加上自己的一小段代码,含有for update语句
"你说的很有道理,但我还是觉得Oracle这样做会导致错误,因为她不能保证自己读出的数据是最新的,而SQL server就能我觉得。"
==>我觉得你还是没有理解透,有点钻牛角尖了。我说过了,这是SQL Server和Oracle各自对于这个问题的理解不同。
反问一下,既然没有commit过,那么何谓最新的数据,获得又有什么积极的意义,只会导致根多的错误的产生。又反过来说,别人都没有commit过(确认要提交),SQL Server竟然可以让别人简单地设置一个read uncommitted就可以可以读到,岂不是有安全泄密的问题?
"我是说,要commit的那个人肯定是要修改数据的,我们假设他不rollback 这种事情一定有吧
并不是每个人都会rollback"
==>这个观点更可有问题了,既然存在有rollback的可能,那么在他还没有做出决定之前,你可以就武断地认为一定会commit呢?
Oracle的这个方法,我认为是很符合逻辑的,没有提交过的数据,可以说对于其他session来说,就是透明的。从这种隔离方案的实现上,可以充分看出SQL Server的体系架构上和oracle的差距。
多谢指点~~可能是我水平不够,对这个问题理解的还是不够好。可能随着知识的增加和经验的丰富自然就会明白的。学东西,特别是像Oracle这样世界级的数据库更是不可能一下子就搞明白的,欲速则不达阿~~谢谢enhydraboy(乱舞的浮尘)一次一次的不吝赐教:)
谢谢ern,谢谢兄弟们
3q