找回密码
 FreeOZ用户注册
查看: 4199|回复: 34
打印 上一主题 下一主题

[业界新闻] SAP以58亿美元现金收购Sybase 抗衡甲骨文【兼谈各数据库技术优缺点】

[复制链接]
跳转到指定楼层
1#
发表于 13-5-2010 15:17:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?FreeOZ用户注册

x

2010-05-13 08:13:29 赛迪网 【大 中 小】 【打印评论:[0]条

SAP是全球最大的商业管理软件厂商,而Sybase是全球领先的数据管理及企业集成解决方案供应商,该交易将有助于SAP与甲骨文抗衡。甲骨文不久前以74亿美元收购Sun。

5月13日消息,据国外媒体报道,德国软件巨擘SAP周三宣布,将以58亿美元的现金收购Sybase。
SAP将以每股65美元的价格收购Sybase,交易总金额为58亿美元。自20世纪90年代中期以来,Sybase股价从未超过50美元。
SAP是全球最大的商业管理软件厂商,而Sybase是全球领先的数据管理及企业集成解决方案供应商,该交易将有助于SAP与甲骨文抗衡。甲骨文不久前以74亿美元收购Sun。
SAP表示,该交易将使SAP获得Sybase的核心技术,使一些商业应用在手机上运行。如果顺利,该交易预计于今年第三季度完成。
在交易宣布前,市场上已经有相关传闻,导致Sybase股价上扬35%至56.14美元。在盘后交易中,Sybase股价再度上扬15%至64.30美元。

回复  

使用道具 举报

2#
 楼主| 发表于 13-5-2010 15:18:17 | 只看该作者
很惊讶Sybase还这么值钱,我以为早就半死不活了呢
回复  

使用道具 举报

3#
发表于 13-5-2010 15:38:47 | 只看该作者
Sybase在IT业风生水起的时候红了很长时间,所以很多大机构的系统都是用Powerbuilder + Sybase的模式,所以至今仍然有不小的市场。在澳洲MQG和WestPac是这个产品组合的知名用户。。。
回复  

使用道具 举报

4#
发表于 13-5-2010 15:52:52 | 只看该作者

主要是老客户.
MS阅读了SYBASE的代码以后搞出来的sql server真的是很烂,也就靠便宜,加上windows平台的容易上手才能搞份额,还有一个有利的因素是ORACLE实在太TM的贵了---从这个角度来说,我喜欢SYBASE和DB2还有MS SQL SERVER.
回复  

使用道具 举报

5#
发表于 13-5-2010 16:22:46 | 只看该作者
原帖由 ma.qy 于 13-5-2010 14:52 发表

主要是老客户.
MS阅读了SYBASE的代码以后搞出来的sql server真的是很烂,也就靠便宜,加上windows平台的容易上手才能搞份额,还有一个有利的因素是ORACLE实在太TM的贵了---从这个角度来说,我喜欢SYBASE和DB2还有MS S ...


这句话有些偏见了,Sybase也叫SQL Server的,和MS的SQL Server实际上同出一源,所以MS SQL Server是没有1.0的,从4.0开始,从那个时候开始MS和Powersoft才正式在这个产品上分道扬镳。。。所以直到现在它们之间很多系统stored proc还是一样的。

而MS SQL Server从2000开始,绝对已经不像是很多人偏见的那样烂了,很多时候是T-SQL语句写得烂而已,然后用跑在64位系统上的Oracle和Sybase和跑在32位平台上的MS SQL Server去比Performance,然后得出一个结论。。。MS SQL是垃圾。。。

评分

参与人数 1威望 +30 收起 理由
coredump + 30 我很赞同!

查看全部评分

回复  

使用道具 举报

6#
 楼主| 发表于 13-5-2010 17:22:33 | 只看该作者
原帖由 雅瑶冬月 于 13-5-2010 15:22 发表


这句话有些偏见了,Sybase也叫SQL Server的,和MS的SQL Server实际上同出一源,所以MS SQL Server是没有1.0的,从4.0开始,从那个时候开始MS和Powersoft才正式在这个产品上分道扬镳。。。所以直到现在它们之间很 ...

的确是这样的,不要习惯性地为了贬微软而贬微软
http://zh.wikipedia.org/zh-cn/Microsoft_SQL_Server

事实上从SQL SERVER 7.0开始,就已经可是让人刮目相看了,SQL Server 2000内部版本号其实是7.5。之所以7.x有这么好的表现,是因为挖来了数据库领域的重要人物,就是那个在海上失踪了的James Gray,(2)。在数据库技术历史上,排行老三, 关系数据库方面是老二(其他两位:数据库技术的先驱查尔斯·巴赫曼(Charles W.Bachman,1973)和关系数据库之父埃德加·科德(Edgar F.Codd,1981))。
回复  

使用道具 举报

7#
发表于 13-5-2010 18:22:54 | 只看该作者
原帖由 雅瑶冬月 于 13-5-2010 15:22 发表


这句话有些偏见了,Sybase也叫SQL Server的,和MS的SQL Server实际上同出一源,所以MS SQL Server是没有1.0的,从4.0开始,从那个时候开始MS和Powersoft才正式在这个产品上分道扬镳。。。所以直到现在它们之间很 ...

他们在架构上面的差距不是一星半点.
除了ORACLE,其他的数据库都有"脏读(还有什么让人一头雾水的幻想读等等)"和"锁管理器"的概念.这样的概念是传统教科书里面的概念,深入人心,但是ORACLE却把这样的概念完全屏弃,使用更简单高效的方法,完全消除了这2个概念的坏处,同时大大提高效率.关系型数据库的有些教科书概念,在很大程度上禁锢了DBMS的发展,大大影响了DBMS的性能.只有ORACLE能作到完全屏弃并彻底颠覆这些概念.
很多人觉得,都是DBMS,都是工业级别的,没有大区别,但是事实不是如此.平台的差异,有影响.但是更主要的还在架构上.
DB2,无论IBM对于大机和操作系统如何专门针对DB2来做优化,在相同COST下对DB2和ORACLE来做OLTP的基准测试,DB2怎么都不可能赢ORACLE.先天的技术架构的缺陷,不可能弥补.
就好比一个健康的人和一个健康的猎豹比100米赛跑,无论这个人怎么训练都不可能赢.
连DB2都如此,何况SQL SERVER.
不过有了这2家,让ORACLE不断更新同时价格不至于离谱,所以从这个角度上说我喜欢他们.

要说到OLAP等,也许各有长处.
但说实话,单从OLTP技术上来说,ORACLE和DB2还有MS SQLSERVER完全不是一个层次的产品.

[ 本帖最后由 ma.qy 于 13-5-2010 17:27 编辑 ]
回复  

使用道具 举报

8#
 楼主| 发表于 13-5-2010 20:17:08 | 只看该作者
原帖由 ma.qy 于 13-5-2010 17:22 发表

他们在架构上面的差距不是一星半点.
除了ORACLE,其他的数据库都有"脏读(还有什么让人一头雾水的幻想读等等)"和"锁管理器"的概念.这样的概念是传统教科书里面的概念,深入人心,但是ORACLE却把这样的概念完全屏弃,使 ...

READ UNCOMMITTED (也就是Dirty Read)是ANSI SQL标准之一[size=14.1667px]。ANSI SQL隔离级别有4种:1 SERIALIZABLE
2 REPEATABLE READ (幻想读)
3 READ COMMITTED
4 READ UNCOMMITTED (脏读)
ORACLE因MVCC所以可以不用4就行,但是目前MVCC大部分数据库都是支持的,不是ORACLE独门绝迹,其它保留4的数据库,只是把dirtyread作为feature或者后向兼容
回复  

使用道具 举报

9#
发表于 13-5-2010 20:37:57 | 只看该作者
早几年前就预计会这样了。
数据库一直是SAP最大的软肋,自己搞的MaxDB不行啊。
买一个成熟的商业数据库以后,就不需要完全依赖其他了。

原帖由 coredump 于 13-5-2010 14:17 发表

2010-05-13 08:13:29 赛迪网 【大 中 小】 【打印】 评论:[0]条
SAP是全球最大的商业管理软件厂商,而Sybase是全球领先的数据管理及企业集成解决方案供应商,该交易将有助于SAP与甲骨文抗衡。甲骨文不久前以74亿 ...
回复  

使用道具 举报

10#
发表于 13-5-2010 20:39:35 | 只看该作者
提示: 作者被禁止或删除, 无法发言
Sybase 和 SAP 在北悉尼的Office相隔一条街, 下面就是合并了.
回复  

使用道具 举报

11#
发表于 13-5-2010 23:04:19 | 只看该作者
原帖由 coredump 于 13-5-2010 19:17 发表

READ UNCOMMITTED (也就是Dirty Read)是ANSI SQL标准之一。ANSI SQL隔离级别有4种:1 SERIALIZABLE
2 REPEATABLE READ (幻想读)
3 READ COMMITTED
4 READ UNCOMMITTED (脏读)
ORACLE因MVCC所以可以不用4就行, ...

1:标准不是一定是好东西。“跑得好才是硬道理”。所谓的ANSI SQL标准,很多都是很粗的。你看看就知道,并不是象J2EE那样是一个工业标准。
2:其他数据库有这么多隔离级别还要有一个什么表来区分隔离级别的互相排斥,说实话,这么复杂的东西把他们自己搞晕了。
3:其他数据库也可以不使用DIRTY READ,但是代价太高,对性能影响很大。因为这样做就需要去挖REDO LOG了。

ORACLE天生没有什么这个读那个读的。如果硬要说ORACLE有隔离级别,那就只有2个
1:所有事务串行。
2:并行。
没有任何什么这个读那个读的。其实一般来说ORACLE没有什么隔离级别的概念。因为他不需要。
ORACLE没有脏读,没有幻象读,没有什么"不可重复读".因为他不需要。ORACLE只有一个读,就是"consistent read".(UPDATE的时候还有一个CURRENT READ,和这个概念不同了)

多版本控制和读写互相不block,其他数据库无法做到(或者代价太高,所以一般不使用这个隔离级别)。很简单,他们没有那个ORACLE用来存放事务前影象的回滚段。
所有的主流关系数据库,全都是隐式递交,除了ORACLE是显式递交以外。这里就可以看出差别--这就是架构带来的差距。
呵呵。.另外,REPEATABLE READ 应该是可重复读,这个不是幻象读.幻象读是下面的READ COMMITED.
ORACLE的所谓的"consistent read",客观效果上面就是这个REPEATABLE READ 可重复读

[ 本帖最后由 ma.qy 于 13-5-2010 22:12 编辑 ]
回复  

使用道具 举报

12#
 楼主| 发表于 14-5-2010 00:05:48 | 只看该作者

回复 #11 ma.qy 的帖子

另外,REPEATABLE READ 应该是可重复读,这个不是幻象读

wikipedia is a good friend : http://en.wikipedia.org/wiki/Isolation_(database_systems)

ORACLE天生没有什么这个读那个读的。如果硬要说ORACLE有隔离级别,那就只有2个
Tom is a good friend too: http://www.oracle.com/technology ... -nov/o65asktom.html

多版本控制和读写互相不block,其他数据库无法做到(或者代价太高,所以一般不使用这个隔离级别)。很简单,他们没有那个ORACLE用来存放事务前影象的回滚段。
MVCC,  link see above post pls
回复  

使用道具 举报

13#
发表于 14-5-2010 00:41:02 | 只看该作者
Tom 说的
REPEATABLE READ :REPEATABLE READ is the isolation level that the SQL standard claims will guarantee a read-consistent result from a query.这个是所谓的标准里面的可重复读,这个就是ORACLE里面的一致读.(我上面说的有错?还是这个TOM说的话有错?)
ORACLE除了这个一致读,没有其他读.它读不出什么"幻象读",没有.
However, in Oracle Database, READ COMMITTED has all of the attributes required to achieve read-consistent queries. In other databases, READ COMMITTED queries can and will return answers that never existed in the database. Moreover, Oracle Database also supports the spirit of READ UNCOMMITTED. The goal of providing a dirty read is to supply a nonblocking read, whereby queries are not blocked by, and do not block, updates of the same data. However, Oracle Database doesn't need dirty reads to achieve this goal, nor does it support them. Dirty reads are an implementation other databases must use to provide nonblocking reads.
ORACLE里面的"READ COMMITTED "实现了所谓标准里面的"REPEATABLE READ ".所以,ORACLE里面的READ COMMITTED 和所谓标准里面的READ COMMITTED 不是一回事情.虽然ORACLE里面也叫READ COMMITTED ,但是那完全不是那回事情.

一般来说,我不太相信别人说的话,除了TOM和ORACLE的官方文档,还有jonathan。
1:tom
2:jonathan
3: official documents.
当他们三个不一致的时候,按这个顺序采纳.我已经发现多出ORACLE的official documents和TOM说的不一致(甚至相反)的情况,最后的结果无一例外经过实验证明都是TOM正确.我从不使用wikipedia 来学习ORACLE.因为我读到太多的人的学习笔记概念一塔糊涂错误一堆.我一般自己DUMP数据结构出来自己看,实在不清楚的看看TOM和JONATHAN的书,就算没有直接点穿我的问题也能给我启发.
多版本控制是ORACLE比较核心的技术,我不知道我说的是否有哪里和TOM说的不一致?呵呵,如果有请指教.我可以怀疑任何人或者我自己,但是我不可能怀疑TOM。我对多版本控制的理解就来自与TOM.
你做做一个UPDATE的时候从V$TRANSACTION里面查到并且把会滚段里面的数据结构DUMP出来你就应该看到ORACLE没有其他的乱七八糟的这个读那个读.实践可以解决所有困惑,TOM教给我的又一个道理.
alter system datafile undodata_file block blocknumber
多版本控制,ORACLE在内存中可以作到最高6个VERSIONS.

我确信我说的和TOM说的没有出入,因为我对隔离级别和多版本的认识正来自与你给的这个TOM的文章.我刚学习的时候把这个文章连同中文翻译的读了5次以上。后来就不用读了,因为我把整个过程DUMP出来看了,不需要再去读了。
你仔细看看TOM的文章.ORACLE的隔离级别,如果硬要算就只有2个.
1:READ COMMITTED ,也就是所谓的事务并行,也就是所谓的可重复读(ORACLE里面叫一直性读).
2:所有事务串行.
漏了一点,ORACLE还有一个READ ONLY.这个隔离级别实际上是不准许SESSION更改数据的情况下一直性查询,本质上还是READ COMMITTED (ORACLE里面叫一直性读),只不过所有相关的CURSOR在TRANSACTION开始的时候一瞬间全部打开.这个本质上和1是一样的.

TOM说的:
重要的是你要知道后台发生了啥.
MVCC这样的概念,当我刚接触的时候我很看中TOM的文章,因为我没有DUMP过整个过程的文件.当我这么做了以后,我发现我知道ORACLE后台的动作了,于是 TOM的文章可有可无了.道理就是TOM上面的话.

“ORACLE因MVCC所以可以不用4就行,但是目前MVCC大部分数据库都是支持的,不是ORACLE独门绝迹,其它保留4的数据库,只是把dirtyread作为feature或者后向兼容”。感觉你读TOM的文章的时候不是很仔细,只扫了几个关键字,因为你没有读到下面的话
Oracle explicitly supports the READ COMMITTED and SERIALIZABLE isolation levels as they're defined in the standard. However, this doesn't tell the whole story. The SQL standard was trying to set up isolation levels that would permit various degrees of consistency for queries performed at each level. REPEATABLE READ is the isolation level that the SQL standard claims will guarantee a read-consistent result from a query. In the SQL standard definition, READ COMMITTED doesn't give you consistent results, and READ UNCOMMITTED is the level to use to get nonblocking reads.

如果你把整个UPDATE过程中从BUFFER BLOCK到REDO LOG还有 undo tbs都DUMP出来看了的话,你就会发现TOM的文章写得非常的晦涩(其实后面的原理很容易理解了),因为很简单:ORACLE里面的隔离级别和教科书上面的不一样,而且他们都使用的READ COMMITTED 却又不是相同的概念。仔细研究TOM的文章,你会发现在其他数据库中的READ COMMITTED 是幻想读的一个情况,但是在ORACLE中READ COMMITTED 却是其他数据库中的REPEATABLE READ .....MY GOD.很饶口.如果不清楚后台的动作的确很迷糊.
TOM在文章里面说了这么多乱七八糟的这个读那个读,是为了和ORACLE做对比,而不是说ORACLE有这些读。
其他数据库不是不可以实现MVCC,而是代价太高。所以为了少代价搞了一对乌七八糟的“这个读那个读”来糊弄。其他数据库使用REPEATABLE READ(也就是ORACLE 的READ COMMITTED ,一般叫CONSISTENT READ) 代价奇大。
MVCC不是ORACLE的特质,但是从使用UNDO TBS来实现MVCC来说是ORACLE的特性。

[ 本帖最后由 ma.qy 于 14-5-2010 01:11 编辑 ]

评分

参与人数 2威望 +40 收起 理由
coredump + 30 谢谢分享!
chubbycat + 10 你太有才了!

查看全部评分

回复  

使用道具 举报

14#
发表于 14-5-2010 09:15:52 | 只看该作者
回复  

使用道具 举报

15#
 楼主| 发表于 14-5-2010 10:29:06 | 只看该作者


ORACLE的UNDO TABLESPACE, 对应SQL SERVER的snapshot tempdb (FROM SQL SERVER 2005).

ORACLE READ COMMITTED是不可能产生Dirty read的,但是有可能产生unrepeatable read和phantom read效果, 这也是为什么ORACLE还要有SERIAL READ的原因。

DIRTY READ, PHANTOM READ是从事务隔离的效果来看的, READ COMMITTED, READ UNCOMMITED是实现的表现形式。

DB2这方面支持的很晚(UDB 9.7), 但是一个严肃的数据库要提供MVCC特性的支持,没有类似ORACLE UNDO TBS这样的机制几乎是不可能的。

ORACLE在事物控制的并发方面成熟得的确很早, 这是它成功的原因之一,但是一些比较具体的数据库技术方面,各个厂商并没有想像中那么巨大的差异。 ORACLE的确是领先很多,比如就这个MVCC特性来说, ORACLE从3开始支持(ORACLE第一个版本是2), SQL SERVER从2005开始支持,DB2 从9.7开始支持。所以很多的印象都是有时效性的,不否认曾经的差距,但也应该看到最新的状态, UPDATE我们的MEMORY,否则大家从我们脑子里读出来的有可能是过期的DIRTY READ数据。
回复  

使用道具 举报

16#
发表于 14-5-2010 12:02:33 | 只看该作者
ORACLE能产生"unrepeatable read"?
请赐教.在什么情况下可以产生unrepeatable read.
我这么多年无数次的想在ORACLE下面实现unrepeatable read都无法实现.
你能告诉我一个测试案例,或者简单说说ORACLE如何产生unrepeatable read的吗?或者说明在unrepeatable read下面ORACLE发生了什么.
TOM的文章明确告诉我:ORACLE没有unrepeatable read.
感觉你读TOM的文章不是很仔细.我发现你还是在抓那几个关键字,不是很清楚后台发生了什么.请注意,READ COMMITTED这个关键字在ORACLE中和其他数据库中是不同概念。

In Oracle Database, using multi-versioning and read-consistent queries, the answer I get from the ACCOUNTS query is the same in the READ COMMITTED example as it was in the READ UNCOMMITTED example. Oracle Database will reconstruct the modified data as it appeared when the query began, returning the answer that was in the database when the query started.


对于其他数据库来说,READ COMMITTED是unrepeatable read的一中情况,而ORACLE默认只支持READ COMMITTED,所以你认为ORACLE支持unrepeatable read.
我已经说过了,ORACLE的READ COMMITTED实际是其他数据库的repeatable read.
ORACLE的READ COMMITTED不仅仅是读取了提交的数据,更重要的是,ORACLE的READ COMMITTED是读取的一致性数据-也就是说,即使数据已经提交,ORACLE读到的时候也不会读这个已经提交的数据,而会去回滚段构造一个查询开始时候的前影象.....MY GOD.

The lesson here is that various databases executing in the same, apparently safe isolation level can and will return very different answers under the same circumstances. It's important to understand that, in Oracle Database, nonblocking reads are not had at the expense of correct answers. You can have your cake and eat it too, sometimes.
请注意这话的意思。

In Oracle Database, using multi-versioning and read-consistent queries, the answer I get from the ACCOUNTS query is the same in the READ COMMITTED example as it was in the READ UNCOMMITTED example. Oracle Database will reconstruct the modified data as it appeared when the query began, returning the answer that was in the database when the query started.
请注意这话的意思。不要去抠关键字,而要知道ORACLE是如何reconstruct 这个前影象的。

我相信这个世界上,就算是TOM也无法在ORACLE上面模拟出unrepeatable read的。

" 这也是为什么ORACLE还要有SERIAL READ的原因。"感觉你不是很清楚ORACLE实现SERIAL READ的目的。似乎你觉得ORACLE实现SERIAL READ的目的是为了查询得到正确的数据,如果不使用SERIAL READ好象ORACLE查询到的就是幻象和不可重复的结果。事实果真如此吗?SERIAL READ是什么意思,呵呵。SERIAL READ是说所有的读取只能串行吗?难道ORACLE数据库里面查询都要排队?
如果你能告诉我如何在ORACLE上面unrepeatable read,我大概要重新学习ORACLE了。
好了。说技术细节实在太累了。如果TOM的文章那么容易一次就读懂,那ORACLE也太容易学习了。
有空你可以去国内的几个ORACLE论坛上面发个帖子问问ORACLE能否产生unrepeatable read,如果有人回答你可以,你问问他如何测试验证。只要你能模拟到unrepeatable read,任何时候欢迎你赐教,呵呵
说实话,你别生气,感觉你还是在抠TOM文章里面的READ COMMITTED的关键字,而不是很清楚后台发生了什么。我已经说过很多次了。这个关键字在ORACLE里面和其他数据库里面的概念不同。
ORACLE读到的数据永远都是“一致性”的,“可重复的”,“正确的”。如果ORACLE由于某个原因无法构造出前影象它会抛出ORA-01555错误,而绝对绝对,永远永远不会返回给你一个不正确的数据。这个"正确"实际上是一致性的意思,你可以参考ORACLE的 concepts参考手册明白一致性的意思。
另外,这里应该有很多人做过开发,任何人如果在ORACLE下开发,请问有设置过事务的隔离级别吗?有人有这样的经验吗?
如果任何人有过把ORACLE的隔离级别设置成“不可重复读”的经验都可以说说是怎么设置的。不需要说明在ORACLE下设置成“不可重复读”对数据正确性有什么影响,只要说明如何设置并且模拟到“不可重复读”就可以,也就是说让ORACLE产生一个“不一直性(不可重复读)”的数据读取。我十分肯定的说这个世界上没有人可以做到这点。我肯定这点是因为我知道ORACLE后台是如何处理事务一直性的。
刚才查了查手册,给你看一个
http://download.oracle.com/docs/ ... 0005.htm#sthref7307
READ ONLY这个隔离级别本质上还是一致性。
大概看看吧。

[ 本帖最后由 ma.qy 于 14-5-2010 11:41 编辑 ]

评分

参与人数 1威望 +30 收起 理由
coredump + 30 谢谢分享!

查看全部评分

回复  

使用道具 举报

17#
发表于 14-5-2010 12:53:07 | 只看该作者
http://download.oracle.com/docs/ ... 0005.htm#sthref7307
这里说明了如何设置隔离级别。
只有2个。
其中的“序列化”是说所有事务都只能排队执行,无法并行事务。而不是说查询也要排队。查询的时候不产生transaction.
我不知道如何设置ORACLE成不可重复读,我也觉得ORACLE不可能被设置成这个隔离级别。
回复  

使用道具 举报

18#
 楼主| 发表于 14-5-2010 13:05:04 | 只看该作者
原帖由 ma.qy 于 14-5-2010 11:02 发表
ORACLE能产生"unrepeatable read"?
请赐教.在什么情况下可以产生unrepeatable read.
我这么多年无数次的想在ORACLE下面实现unrepeatable read都无法实现.
你能告诉我一个测试案例,或者简单说说ORACLE如何产生unre ...

http://download-uk.oracle.com/docs/cd/B13789_01/server.101/b10743/consist.htm

[tr][/tr]
Read committedThis is the default transaction isolation level. Each query executed by a transaction sees only data that was committed before the query (not the transaction) began. An Oracle query never reads dirty (uncommitted) data.Because Oracle does not prevent other transactions from modifying the data read by a query, that data can be changed by other transactions between two executions of the query. Thus, a transaction that runs a given query twice can experience both nonrepeatable read and phantoms.
回复  

使用道具 举报

19#
发表于 14-5-2010 13:51:33 | 只看该作者
我明白了。我和你说的不是一个事情。
我说的是一个CURSOR打开以后不会“unrepeatable read”。
Because Oracle does not prevent other transactions from modifying the data read by a query, that data can be changed by other transactions between two executions of the query. Thus, a transaction that runs a given query twice can experience both nonrepeatable read and phantoms.
查了2次,一前一后,中间有事务更改了数据。由于CURSOR中间关闭过一次,很显然查出来不同。这就是著名的更新丢失问题,因为前后image不一样了,需要SELECT FOR UPDATE缩定,也就是所谓的READ ONLY方法。
我说的是CURSOR打开以后,在关闭以前看到的一定是一个印象。。。。。。
OK。我们说的不是一个事情。

[ 本帖最后由 ma.qy 于 14-5-2010 12:57 编辑 ]
回复  

使用道具 举报

20#
 楼主| 发表于 14-5-2010 14:08:49 | 只看该作者
原帖由 ma.qy 于 14-5-2010 12:51 发表
我说的是CURSOR打开以后,在关闭以前看到的一定是一个印象。。。。。。  ...

这样能叫2次查询吗
回复  

使用道具 举报

21#
发表于 14-5-2010 14:18:47 | 只看该作者
原帖由 coredump 于 14-5-2010 13:08 发表

这样能叫2次查询吗

很显然是2次。
每一个SQL语句的执行都有一个隐式的游标,ORACLE后台执行了游标的创建,打开,查询和关闭。
如果查2次,在第一次查询已经关闭了以后,再查一次,在内存中,ORACLE重新划分了一块private sql 区域来容纳这个游标。
从生命周期来说,是完全不同的2个游标,虽然都是同一sql。
用面向对象的思想就是:同一个类产生的2个不同对象,在内存中有完全不同的地址。

所以,如果你把这个游标打开在事务开始的时候,关闭在事务COMMIT的时候,就不会有这个问题了。
回复  

使用道具 举报

22#
 楼主| 发表于 14-5-2010 14:24:05 | 只看该作者
原帖由 ma.qy 于 14-5-2010 13:18 发表

很显然是2次。
每一个SQL语句的执行都有一个隐式的游标,ORACLE后台执行了游标的创建,打开,查询和关闭。
如果查2次,在第一次查询已经关闭了以后,再查一次,在内存中,ORACLE重新划分了一块private sql 区域来 ...

这当然是,问题是你那个
我说的是CURSOR打开以后,在关闭以前看到的一定是一个印象。。。。。。  ...

怎么可以当成2次 query
回复  

使用道具 举报

23#
发表于 14-5-2010 14:30:45 | 只看该作者
原帖由 coredump 于 14-5-2010 13:24 发表

这当然是,问题是你那个

怎么可以当成2次 query

所以我说我们说的不是同一个问题。
搞来搞去2个人在刻舟求sword.
另外,现在ORACLE可以把CURSOR缓存下来,连软解析都省略了,直接命中重用,我所谓的2次查询的 CURSOR在内存中可以是同一块区域。但是他们有一个关键性质变了:查询起始时间。这个决定了IMAGE的TIMESTAMP。

[ 本帖最后由 ma.qy 于 14-5-2010 13:32 编辑 ]
回复  

使用道具 举报

24#
 楼主| 发表于 14-5-2010 14:35:39 | 只看该作者
原帖由 ma.qy 于 14-5-2010 13:30 发表

所以我说我们说的不是同一个问题。
搞来搞去2个人在刻舟求sword.
另外,现在ORACLE可以把CURSOR缓存下来,连软解析都省略了,直接命中重用,我所谓的2次查询的 CURSOR在内存中可以是同一块区域。但是他们有一个关 ...


session_cached_cursors很早的版本就有这个功能,只不过Oracle 10g后 默认将设置为20(之前为0)。


So...
回复  

使用道具 举报

25#
发表于 14-5-2010 14:52:40 | 只看该作者
原帖由 coredump 于 14-5-2010 13:35 发表


session_cached_cursors很早的版本就有这个功能,只不过Oracle 10g后 默认将设置为20(之前为0)。


So...

为0,呵呵。那会有cached的session吗?
另外这个东西有的时候不好用。在我的测试CASES中有的时候实际行为和他文档的说法不符合。

[ 本帖最后由 ma.qy 于 14-5-2010 14:02 编辑 ]
回复  

使用道具 举报

26#
 楼主| 发表于 14-5-2010 15:13:23 | 只看该作者
原帖由 ma.qy 于 14-5-2010 13:52 发表

为0,呵呵。那会有cached的session吗?
另外这个东西有的时候不好用。在我的测试CASES中有的时候实际行为和他文档的说法不符合。

不管是否开启SESSION_CACHED_CURSORS, 这个参数都只对性能有影响,对执行的结果集是没有影响的。而且,你也不可以指定自己是否使用CACHED_CURSOR。那么你的观点是:

1. 从用户看发起了2次同样的查询,因为使用了同一个CACHED CURSOR,所以是一个查询?
2. 还是从用户看发起了一次查询,但是在中间因为什么原因你认为这是2次查询?
3. or something else?
回复  

使用道具 举报

27#
发表于 14-5-2010 15:34:06 | 只看该作者

今天讨论database哦。。。那我也来说2句:

对于企业级数据库而言,并行操作是非常至关重要的,就是(parallel )

我在Teradata工作,TD的OLAP是最棒的。。。关键就是parallel 做的好,用的是bynet

评分

参与人数 1威望 +30 收起 理由
coredump + 30 你太有才了!

查看全部评分

回复  

使用道具 举报

28#
 楼主| 发表于 14-5-2010 15:49:43 | 只看该作者
原帖由 sh-boy 于 14-5-2010 14:34 发表
对于企业级数据库而言,并行操作是非常至关重要的,就是(parallel )

我在Teradata工作,TD的OLAP是最棒的。。。关键就是parallel 做的好,用的是bynet

又见牛人出没,TeraData太高端了,都没见过,有空给大家讲讲吧
回复  

使用道具 举报

29#
发表于 14-5-2010 15:58:03 | 只看该作者
搬个板凳来学习了
回复  

使用道具 举报

30#
发表于 14-5-2010 16:03:54 | 只看该作者
原帖由 coredump 于 14-5-2010 14:13 发表

不管是否开启SESSION_CACHED_CURSORS, 这个参数都只对性能有影响,对执行的结果集是没有影响的。而且,你也不可以指定自己是否使用CACHED_CURSOR。那么你的观点是:

1. 从用户看发起了2次同样的查询,因为使用了 ...

很显然是2。
回复  

使用道具 举报

您需要登录后才可以回帖 登录 | FreeOZ用户注册

本版积分规则

小黑屋|手机版|Archiver|FreeOZ论坛

GMT+11, 2-11-2024 02:27 , Processed in 0.066185 second(s), 46 queries , Gzip On, Redis On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表