转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 数据库 >> ORACLE >> 正文
把Oracle数据库移植到Microsoft SQL Server 7.0         ★★★★

把Oracle数据库移植到Microsoft SQL Server 7.0

作者:闵涛 文章来源:闵涛的学习笔记 点击数:8695 更新时间:2009/4/22 22:06:51
数据的SQL语句隐式或者显式的使用一种多版本一致模型(multiversion consistency model)。在这种模型中,数据读者在读数据行以前,缺省的既不获得一个锁定也不等待其他的锁定解开。当读者需要一个已经改变但别的写入者还没有提交的数据时,Oracle通过使用后滚段来重建一个数据行的快照的方法来重新创建旧的数据。

Oracle中的数据写入者在更新、删除或者插入数据时要请求锁定。锁定将一直维持到事务结束,并且禁止别的用户覆盖尚未提交的修改。

Microsoft SQL Server使用多粒度锁定,该锁定允许用事务来锁定不同类型的资源。为了把锁定的开销降到最低,SQL Server自动在与任务相配的层次上锁定资源。以较小的间隔尺寸锁定,例如行,增强了并行,但是管理开销较大,因为如果有许多行锁定,就必须维持多个锁定。以较大的间隔尺寸锁定,例如表,在并行方面是昂贵的,因为对整个表的锁定限制了其他事务对表中任何一部分的访问,但是管理开销却比较小,因为只要维持少数几个锁定。SQL Server可以锁定这些资源(按照间隔尺寸递增的顺序排列)。

资源 描述 RID 行标识符。用于一个单行表的独立锁定。 Key 键;索引中的一个行锁定。用于在一个可串行化的事务中保护键范围。 Page 8-KB数据页或者索引页。 Extent 相邻的八个数据页或者索引页的组。 Table 整个表,包括所有数据和索引。 DB 数据库。

 

SQL Server使用不同的锁定模式锁定资源,使用哪种模式决定了当前事务访问如何访问资源。

锁定模式 描述 Shared (S) 用于那些不修改或者更新数据的操作(只读操作),例如一个SELECT语句。 Update (U) 用于那些可以被更新的资源。防止当多个会话被读入、锁定,然后潜在的更新资源时发生一个公共形式的死锁。 Exclusive (X) 用于数据修改操作,例如UPDATE、INSERT、或者DELETE。确保不会同时发生对同一个资源的多个修改操作。 Intent 用于建立一个锁定层次。 Schema 在一个依靠表的模式的操作执行时使用。有两种类型的模式锁定:schema stability (Sch-S)和schema modification (Sch-M)。

 

对于任何RDBMS都很重要的一点是,快速释放锁定以提供最大的并行性。你可以通过尽可能短的保持一个事务来确保快速释放锁定。如果可能的话,事务不应该跨越多个往返行程到服务器,也不应该包括用户“思考”的时间。如果你使用游标,你也应该使你的应用程序很快提取数据,因为未提取数据的扫描将在服务器上占据共享锁定,因此将阻碍更新。欲了解更多信息,请参看本章后面的“使用ODBC”部分。

 

改变缺省的锁定行为

Microsoft SQL Server和Oracle都允许开发人员使用非缺省的锁定和孤立行为。在Oracle中,最普通的机制是SELECT 命令的FOR UPDATE子句,SET TRANSACTION READ ONLY命令,以及显式的LOCK TABLE命令。

因为两者的锁定和孤立策略如此不同,所以很难在Oracle和SQL Server之间直接映射锁定选择。要更好的理解这一过程,重要的一点是理解SQL Server提供的修改缺省锁定行为的选择。

在SQL Server中,修改缺省锁定行为最常用的机制是SET TRANSACTION ISOLATION LEVEL语句和在SELECT和UPDATE语句中支持的锁定暗示。SET TRANSACTION ISOLATION LEVEL语句为一个用户会话的持续时间设定事务孤立级别。除非在一个SQL语句的FROM子句中标明了表级别的锁定暗示,否则这将变成该会话的缺省行为。事务孤立是这样设定的:

SET TRANSACTION ISOLATION LEVEL

{

READ COMMITTED

| READ UNCOMMITTED

| REPEATABLE READ

| SERIALIZABLE

}

  • READ COMMITTED

缺省的SQL Server孤立级别。如果你使用这种选择,你的应用程序将不能读取其他事务还没有提交的数据。在这种模式下,一旦数据从页上读出,仍然要释放共享锁定。如果应用程序在同一个事务中重新读取同一个的数据区,将会看到别的用户做的修改。

  • SERIALIZABLE

如果设定了这种选择,事务将同其他事务孤立起来。如果你不希望在查询中看到其他用户做的修改,你可以设置事务的孤立级别为SERIALIZABLE。SQL Server将占据所有的共享锁定,直到事务结束。你可以通过在SELECT语句中表名的后面使用HOLDLOCK暗示来在一个更小的级别上取得同样的效果。

  • READ UNCOMMITTED

如果设定为这种选择,SQL Server读者将不会受到阻塞,就像在Oracle中一样。该选择实现了污损读取或者说是孤立级别为0的锁定,这意味着不使用任何共享锁定并且也不使用任何独占的锁定。当这个选项选定后,有可能会读到未提交的或者污损的数据;在事务结束以前,数据可能会改变,数据集中的行可能出现也可能消失。这个选项同一个事务中在所有SELECT语句中设定所有的表为NOLOCK的效果是一样的。这是四种孤立级别中限制性最小的一种。只有在你已经彻底的搞清楚了它将对你的应用程序结果的精确度有什么样的影响的前提下才能使用这种选择。

 

SQL Server有两种方法实现Oracle中的READ ONLY功能:

  • 如果一个应用程序中的事务需要可重复读取的行为,你也许需要使用SQL Server提供的SERIALIZABLE孤立级别。
  • 如果所有的数据库访问都是只读的,你可以设置SQL Server数据库选项为READ ONLY来提高性能。

 

SELECT…FOR UPDATE

当一个应用程序利用WHERE CURRENT OF 语法来在一个游标上实现定位更新或者删除时,首先使用Oracle中的SELECT…FOR UPDATE语句。在这种情况下,可以随意去掉FOR UPDATE子句,因为Microsoft SQL Server游标的缺省行为是“可更新的”。

缺省情况下,SQL Server游标在提取行下不占据锁定。SQL Server使用一种乐观的并行策略(optimistic concurrency strategy)来防止更新时相互之间的覆盖。如果一个用户试图更新或者删除一个读入游标后已经被修改过的行,SQL Server将给出一个错误消息。应用程序可以捕获该消息,并且重新进行适当的更新或者删除。要改变这个行为,开发人员可以在游标声明中使用SCROLL_LOCKS。

通常情况下,乐观的并行策略支持较高的并行性,所谓通常情况是指更新器之间冲突很少的情况。如果你的应用程序确实需要保证一行在被提取以后不会被修改,你可以在SELECT语句中使用UPDLOCK暗示。这个暗示不会阻碍别的读者,但是它禁止其他潜在的写入者也获得该数据的更新锁定。使用ODBC时,你可以通过使用SQLSETSTMTOPTION (…,SQL_CONCURRENCY)= SQL_CONCUR_LOCK来达到同样的目的。但是,其他的任何选择都将减少并行性。

 

表级别的锁定

Microsoft SQL Server可以用SELECT…table_name (TABLOCK)语句来锁定整个表。这和Oracle的 LOCK TABLE…IN SHARE MODE语句是一样的。该锁定允许其他人读取一个表,但是禁止他们修改该表。缺省情况下,锁定将维持到语句的结束。如果你同时加上了HOLDLOCK关键字(SELECT…table_name (TABLOCK HOLDLOCK)),表的锁定将一直维持到事务的结束。

可以用SELECT…table_name (TABLOCKX)语句在一个SQL Server表上设置一个独占的锁定。该语句请求一个表上的独占锁定。该锁定禁止其他人读取和修改该表,并且将一直维持到命令或者事务结束。这同Oracle中TABLE…IN EXCLUSIVE MODE语句的功能是一样的。

SQL Server没有为显式的锁定请求提供NOWAIT选项。

 

锁定升级

当一个查询向表请求行时,Microsoft SQL Server自动生成一个页级别的锁定。但是,如果查询请求表中的大部分行时,SQL Server将把锁定从页级别升级到表级别。这个过程叫做锁定升级。

锁定增加使那些产生较大结果集的表的扫描和操作更加有效,因为它减少了锁定的管理开销。缺少WHERE子句的SQL语句一般都要造成锁定增加。

在读取操作中,如果一个共享页级别的锁定增加为一个表锁定时,将应用一个共享表锁定(TABLOCK)。在下列情况下应用共享的表级别的锁定:

  • 使用了HOLDLOCK或者SET TRANSACTION ISOLATION LEVEL SERIALIZABLE语句。
  • 优化器选择了一个表的扫描。
  • 表中积累的共享锁定的数目超过锁定升级的极限。

表中缺省的锁定升级的极限是200页,但是该极限可以用最小和最大范围定制为依赖于表尺寸的一个百分比。欲了解关于锁定升级极限的更多信息,请参看SQL Server联机手册。

在一个写操作中,当一个UPDATE锁定被升级为一个表锁定时,应用一个独占表锁定(TABLOCKX)。独占表锁定在下列情况下使用:

  • 更新或者删除操作无索引可用。
  • 表中有独占锁定的页的数目超过锁定升级上限。
  • 创建了一个分簇的索引。

 

Oracle不能升级行级别的锁定,这将导致一些包含了FOR UPDATE子句的查询出问题。例如,假设STUDENT表有100,000行数据,并且一个Oracle用户给出下列语句:

SELECT * FROM STUDENT FOR UPDATE

 

这个语句强制Oracle RDBMS依次锁定STUDENT表的一行;这将花去一段时间。它永远也不会要求升级锁定到整个表。

在SQL Server同样的查询是:

SELECT * FROM STUDENT (UPDLOCK)

 

当这个查询运行的时候,页级别的锁定升级为表级别的锁定,后者更加有效并且明显要快一些。

死锁

当一个进程锁定了另一个进程需要的页或者表的时候,而第二个进程又锁定了第一个进程需要的一页,这个时候就会发生死锁。死锁也叫抱死。SQL Server自动探测和解决死锁。如果找到一个死锁,服务器将终止完成了抱死的用户进程。

 

在每次数据修改之后,你的程序代码需要检查1205号消息,这个消息指出一个死锁。如果返回这个消息,就说明发生了一个死锁并且事务已经后滚。在这种情况下,你的应用程序必须重新开始这个事务。

死锁一般可以通过一些简单的技术加以避免:

  • 在你的应用程序的各部分以同样的顺序访问表。
  • 在每个表上使用分簇的索引以强制一个显式的行顺序。
  • 使事务简短。

欲了解详细信息,请参阅Microsoft Knowledge Base文章“Detecting and Avoiding Deadlocks in Microsoft SQL Server”

 

远程事务

在Oracle中执行远程事务,你必须通过一个数据库连接访问远程数据库节点。在SQL Server中,你必须访问一个远程服务器。远程服务器是一台运行SQL Server的服务器,用户可以用他们的本地服务器访问该服务器。当某个服务器被设置为远程服务器,用户就可以在其上使用系统过程和存储过程而不需要显式的登录到上面。

远程服务器是成对设置的。你必须配置两台服务器,使它们互相把对方当作远程服务器。每台服务器的名字都必须用sp_addlinkedserver系统存储过程或者SQL Server Enterprise Manager加到伙伴服务器上。

设置完远程服务器以后,你可以用sp_addremotelogin系统存储过程或者SQL Server Enterprise Manager来为那些必须访问远程服务器的用户设置远程登录账号。在这一步完成以后,你还必须赋予他们执行存储过程的权限。

然后用EXECUTE语句来在远程服务器上执行过程。这个例子在远程服务器STUDSVR1上执行了validate_student存储过程,并且将指明成功或者失败的返回情况存储在@retvalue1中:

DECLARE @retvalue1 int

EXECUTE @retvalue = STUDSVR1.student_db.student_admin.validate_student ''''111111111''''

 

上一页  [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]  ...  下一页 >> 


[Access]sql随机抽取记录  [Access]ASP&SQL让select查询结果随机排序的实现方法
[聊天工具]企业邮件系统的利器----FoxMail Server  [系统软件]OPEN SERVER 5.0.5安装EXP300阵列柜
[系统软件]SQL语句性能优化--LECCO SQL Expert  [系统软件]关于Windows2000Server的灾难恢复
[常用软件][网络]下载服务革命性风暴Poco Server评测  [C语言系列]动态创建SQL Server数据库、表、存储过程等架构信…
[C语言系列]SQL Server到DB2连接服务器的实现  [C语言系列]SQL Server到SYBASE连接服务器的实现
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Sql Server  · MySql
    · Access  · ORACLE
    · SyBase  · 其他
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台